Эх сурвалжийг харах

BETA: ai scripts revise:
* All scripts extending AbstractNpcAI instead of L2AttackableAIScript.
* All static variables to upper-case.
* All constructors moved just after variables and private instead of public.
* Initiating script with new Script(Script.class.getSimpleName(), "ai") instead of new Script("Script", "ai")
* Removed useless checks example addKillId(123) onKill() if (npc.getNpcId() == 123).
* Moved registerMobs method into AbstractNpcAI.
* L2AttackableAIScript is now final please do not extend it anymore.
* Cleanup

Rumen Nikiforov 12 жил өмнө
parent
commit
dcab719330
51 өөрчлөгдсөн 2058 нэмэгдсэн , 1537 устгасан
  1. 72 64
      L2J_DataPack_BETA/dist/game/data/scripts/ai/fantasy_isle/MC_Show.java
  2. 114 64
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/BeastFarm.java
  3. 9 7
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Chests.java
  4. 15 14
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Chimeras.java
  5. 49 36
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DenOfEvil.java
  6. 174 83
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/EnergySeeds.java
  7. 6 5
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/EvasGiftBoxes.java
  8. 9 7
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FairyTrees.java
  9. 197 101
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FeedableBeasts.java
  10. 18 10
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/GiantScouts.java
  11. 39 81
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/L2AttackableAIScript.java
  12. 17 16
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Monastery.java
  13. 28 30
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PavelArchaic.java
  14. 49 27
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PlainsOfLizardman.java
  15. 8 15
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PolymorphingAngel.java
  16. 7 5
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java
  17. 9 6
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java
  18. 28 25
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/RandomSpawn.java
  19. 19 15
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Remnants.java
  20. 9 10
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Sandstorms.java
  21. 19 7
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SearchingMaster.java
  22. 23 45
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeeThroughSilentMove.java
  23. 148 86
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeedOfAnnihilation.java
  24. 15 13
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Slaves.java
  25. 108 64
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/StakatoNest.java
  26. 9 8
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/StarStones.java
  27. 93 104
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SummonMinions.java
  28. 16 11
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Amaskari.java
  29. 13 17
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas.java
  30. 14 22
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Baium.java
  31. 162 166
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Beleth.java
  32. 24 23
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Core.java
  33. 37 28
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DarkWaterDragon.java
  34. 17 19
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DemonPrince.java
  35. 7 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DrChaos.java
  36. 25 19
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Epidos.java
  37. 21 11
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/FleeNpc.java
  38. 17 13
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/GeneralDilios.java
  39. 54 46
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Gordon.java
  40. 11 11
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/HellboundCore.java
  41. 26 26
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Keltas.java
  42. 9 9
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/NaiaLock.java
  43. 42 31
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Orfen.java
  44. 16 17
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/OutpostCaptain.java
  45. 5 7
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/QueenAnt.java
  46. 19 30
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Ranku.java
  47. 23 14
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinWardens.java
  48. 17 17
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Typhoon.java
  49. 99 45
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Valakas.java
  50. 8 6
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Zaken.java
  51. 85 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/AbstractNpcAI.java

+ 72 - 64
L2J_DataPack_BETA/dist/game/data/scripts/ai/fantasy_isle/MC_Show.java

@@ -18,7 +18,7 @@ import java.text.SimpleDateFormat;
 import java.util.Map;
 
 import javolution.util.FastMap;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GameTimeController;
@@ -36,27 +36,38 @@ import com.l2jserver.gameserver.network.serverpackets.PlaySound;
  * MC Show AI.
  * @author Kerberos
  */
-public class MC_Show extends L2AttackableAIScript
+public class MC_Show extends AbstractNpcAI
 {
-	private static int mc = 32433;
+	private static int MC = 32433;
 	private static int[] singers =
 	{
-		32431, 32432
+		32431,
+		32432
 	};
-	private static int[] circus =
+	private static int[] CIRCUS =
 	{
-		32442, 32443, 32444, 32445, 32446
+		32442,
+		32443,
+		32444,
+		32445,
+		32446
 	};
-	private static int[] individuals =
+	private static int[] INDIVIDUALS =
 	{
-		32439, 32440, 32441
+		32439,
+		32440,
+		32441
 	};
-	private static int[] showstuff =
+	private static int[] SHOWSTUFF =
 	{
-		32424, 32425, 32426, 32427, 32428
+		32424,
+		32425,
+		32426,
+		32427,
+		32428
 	};
-	private static boolean isStarted = false;
-	private static NpcStringId[] messages =
+	private static boolean IS_STARTED = false;
+	private static NpcStringId[] MESSAGES =
 	{
 		NpcStringId.HOW_COME_PEOPLE_ARE_NOT_HERE_WE_ARE_ABOUT_TO_START_THE_SHOW_HMM,
 		NpcStringId.UGH_I_HAVE_BUTTERFLIES_IN_MY_STOMACH_THE_SHOW_STARTS_SOON,
@@ -166,23 +177,23 @@ public class MC_Show extends L2AttackableAIScript
 	
 	private void load()
 	{
-		talks.put("1", new ShoutInfo(messages[1], "2", 1000));
-		talks.put("2", new ShoutInfo(messages[2], "3", 6000));
-		talks.put("3", new ShoutInfo(messages[3], "4", 4000));
-		talks.put("4", new ShoutInfo(messages[4], "5", 5000));
-		talks.put("5", new ShoutInfo(messages[5], "6", 3000));
-		talks.put("8", new ShoutInfo(messages[8], "9", 5000));
-		talks.put("9", new ShoutInfo(messages[9], "10", 5000));
-		talks.put("12", new ShoutInfo(messages[11], "13", 5000));
-		talks.put("13", new ShoutInfo(messages[12], "14", 5000));
-		talks.put("15", new ShoutInfo(messages[13], "16", 5000));
-		talks.put("16", new ShoutInfo(messages[14], "17", 5000));
-		talks.put("18", new ShoutInfo(messages[16], "19", 5000));
-		talks.put("19", new ShoutInfo(messages[17], "20", 5000));
-		talks.put("21", new ShoutInfo(messages[18], "22", 5000));
-		talks.put("22", new ShoutInfo(messages[19], "23", 400));
-		talks.put("25", new ShoutInfo(messages[20], "26", 5000));
-		talks.put("26", new ShoutInfo(messages[21], "27", 5400));
+		talks.put("1", new ShoutInfo(MESSAGES[1], "2", 1000));
+		talks.put("2", new ShoutInfo(MESSAGES[2], "3", 6000));
+		talks.put("3", new ShoutInfo(MESSAGES[3], "4", 4000));
+		talks.put("4", new ShoutInfo(MESSAGES[4], "5", 5000));
+		talks.put("5", new ShoutInfo(MESSAGES[5], "6", 3000));
+		talks.put("8", new ShoutInfo(MESSAGES[8], "9", 5000));
+		talks.put("9", new ShoutInfo(MESSAGES[9], "10", 5000));
+		talks.put("12", new ShoutInfo(MESSAGES[11], "13", 5000));
+		talks.put("13", new ShoutInfo(MESSAGES[12], "14", 5000));
+		talks.put("15", new ShoutInfo(MESSAGES[13], "16", 5000));
+		talks.put("16", new ShoutInfo(MESSAGES[14], "17", 5000));
+		talks.put("18", new ShoutInfo(MESSAGES[16], "19", 5000));
+		talks.put("19", new ShoutInfo(MESSAGES[17], "20", 5000));
+		talks.put("21", new ShoutInfo(MESSAGES[18], "22", 5000));
+		talks.put("22", new ShoutInfo(MESSAGES[19], "23", 400));
+		talks.put("25", new ShoutInfo(MESSAGES[20], "26", 5000));
+		talks.put("26", new ShoutInfo(MESSAGES[21], "27", 5400));
 		
 		walks.put("npc1_1", new WalkInfo(new L2CharPosition(-56546, -56384, -2008, 0), "npc1_2", 1200));
 		walks.put("npc1_2", new WalkInfo(new L2CharPosition(-56597, -56384, -2008, 0), "npc1_3", 1200));
@@ -274,13 +285,10 @@ public class MC_Show extends L2AttackableAIScript
 		walks.put("27", new WalkInfo(new L2CharPosition(-56702, -56340, -2008, 0), "29", 1800));
 	}
 	
-	public MC_Show(int id, String name, String descr)
+	private MC_Show(String name, String descr)
 	{
-		super(id, name, descr);
-		registerMobs(new int[]
-		{
-			32433, 32431, 32432, 32442, 32443, 32444, 32445, 32446, 32424, 32425, 32426, 32427, 32428
-		}, QuestEventType.ON_SPAWN);
+		super(name, descr);
+		addSpawnId(32433, 32431, 32432, 32442, 32443, 32444, 32445, 32446, 32424, 32425, 32426, 32427, 32428);
 		load();
 		scheduleTimer();
 	}
@@ -327,12 +335,12 @@ public class MC_Show extends L2AttackableAIScript
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (isStarted)
+		if (IS_STARTED)
 		{
 			switch (npc.getNpcId())
 			{
 				case 32433:
-					autoChat(npc, messages[0], Say2.NPC_SHOUT);
+					autoChat(npc, MESSAGES[0], Say2.NPC_SHOUT);
 					startQuestTimer("1", 30000, npc, null);
 					break;
 				case 32431:
@@ -376,14 +384,14 @@ public class MC_Show extends L2AttackableAIScript
 		
 		if (event.equalsIgnoreCase("Start"))
 		{
-			isStarted = true;
-			addSpawn(mc, -56698, -56430, -2008, 32768, false, 0);
+			IS_STARTED = true;
+			addSpawn(MC, -56698, -56430, -2008, 32768, false, 0);
 		}
-		else if ((npc != null) && isStarted)
+		else if ((npc != null) && IS_STARTED)
 		{
 			if (event.equalsIgnoreCase("6"))
 			{
-				autoChat(npc, messages[6], Say2.NPC_SHOUT);
+				autoChat(npc, MESSAGES[6], Say2.NPC_SHOUT);
 				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(-56511, -56647, -2008, 36863));
 				npc.broadcastPacket(new PlaySound(1, "NS22_F", 0, 0, 0, 0, 0));
 				addSpawn(singers[0], -56344, -56328, -2008, 32768, false, 224000);
@@ -400,7 +408,7 @@ public class MC_Show extends L2AttackableAIScript
 				switch (npc.getNpcId())
 				{
 					case 32433:
-						autoChat(npc, messages[7], Say2.NPC_SHOUT);
+						autoChat(npc, MESSAGES[7], Say2.NPC_SHOUT);
 						npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(-56698, -56430, -2008, 32768));
 						startQuestTimer("8", 12000, npc, null);
 						break;
@@ -414,15 +422,15 @@ public class MC_Show extends L2AttackableAIScript
 			{
 				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(-56483, -56665, -2034, 32768));
 				npc.broadcastPacket(new PlaySound(1, "TP05_F", 0, 0, 0, 0, 0));
-				startQuestTimer("npc1_1", 3000, addSpawn(circus[0], -56495, -56375, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc2_1", 3000, addSpawn(circus[0], -56491, -56289, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc3_1", 3000, addSpawn(circus[1], -56502, -56246, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc4_1", 3000, addSpawn(circus[1], -56496, -56429, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc5_1", 3500, addSpawn(circus[2], -56505, -56334, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc6_1", 4000, addSpawn(circus[3], -56545, -56427, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc7_1", 4000, addSpawn(circus[3], -56552, -56248, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc8_1", 3000, addSpawn(circus[4], -56493, -56473, -2008, 32768, false, 101000), null);
-				startQuestTimer("npc9_1", 3000, addSpawn(circus[4], -56504, -56201, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc1_1", 3000, addSpawn(CIRCUS[0], -56495, -56375, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc2_1", 3000, addSpawn(CIRCUS[0], -56491, -56289, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc3_1", 3000, addSpawn(CIRCUS[1], -56502, -56246, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc4_1", 3000, addSpawn(CIRCUS[1], -56496, -56429, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc5_1", 3500, addSpawn(CIRCUS[2], -56505, -56334, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc6_1", 4000, addSpawn(CIRCUS[3], -56545, -56427, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc7_1", 4000, addSpawn(CIRCUS[3], -56552, -56248, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc8_1", 3000, addSpawn(CIRCUS[4], -56493, -56473, -2008, 32768, false, 101000), null);
+				startQuestTimer("npc9_1", 3000, addSpawn(CIRCUS[4], -56504, -56201, -2008, 32768, false, 101000), null);
 				startQuestTimer("11", 100000, npc, null);
 			}
 			else if (event.equalsIgnoreCase("11"))
@@ -430,7 +438,7 @@ public class MC_Show extends L2AttackableAIScript
 				switch (npc.getNpcId())
 				{
 					case 32433:
-						autoChat(npc, messages[10], Say2.NPC_SHOUT);
+						autoChat(npc, MESSAGES[10], Say2.NPC_SHOUT);
 						npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(-56698, -56430, -2008, 32768));
 						startQuestTimer("12", 5000, npc, null);
 						break;
@@ -441,33 +449,33 @@ public class MC_Show extends L2AttackableAIScript
 			}
 			else if (event.equalsIgnoreCase("14"))
 			{
-				startQuestTimer("social1", 2000, addSpawn(individuals[0], -56700, -56385, -2008, 32768, false, 49000), null);
+				startQuestTimer("social1", 2000, addSpawn(INDIVIDUALS[0], -56700, -56385, -2008, 32768, false, 49000), null);
 				startQuestTimer("15", 7000, npc, null);
 			}
 			else if (event.equalsIgnoreCase("17"))
 			{
-				autoChat(npc, messages[15], Say2.NPC_SHOUT);
-				startQuestTimer("social1", 2000, addSpawn(individuals[1], -56700, -56340, -2008, 32768, false, 32000), null);
+				autoChat(npc, MESSAGES[15], Say2.NPC_SHOUT);
+				startQuestTimer("social1", 2000, addSpawn(INDIVIDUALS[1], -56700, -56340, -2008, 32768, false, 32000), null);
 				startQuestTimer("18", 9000, npc, null);
 			}
 			else if (event.equalsIgnoreCase("20"))
 			{
-				startQuestTimer("social1", 2000, addSpawn(individuals[2], -56703, -56296, -2008, 32768, false, 13000), null);
+				startQuestTimer("social1", 2000, addSpawn(INDIVIDUALS[2], -56703, -56296, -2008, 32768, false, 13000), null);
 				startQuestTimer("21", 8000, npc, null);
 			}
 			else if (event.equalsIgnoreCase("23"))
 			{
 				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(-56702, -56340, -2008, 32768));
 				startQuestTimer("24", 2800, npc, null);
-				addSpawn(showstuff[0], -56672, -56406, -2000, 32768, false, 20900);
-				addSpawn(showstuff[1], -56648, -56368, -2000, 32768, false, 20900);
-				addSpawn(showstuff[2], -56608, -56338, -2000, 32768, false, 20900);
-				addSpawn(showstuff[3], -56652, -56307, -2000, 32768, false, 20900);
-				addSpawn(showstuff[4], -56672, -56272, -2000, 32768, false, 20900);
+				addSpawn(SHOWSTUFF[0], -56672, -56406, -2000, 32768, false, 20900);
+				addSpawn(SHOWSTUFF[1], -56648, -56368, -2000, 32768, false, 20900);
+				addSpawn(SHOWSTUFF[2], -56608, -56338, -2000, 32768, false, 20900);
+				addSpawn(SHOWSTUFF[3], -56652, -56307, -2000, 32768, false, 20900);
+				addSpawn(SHOWSTUFF[4], -56672, -56272, -2000, 32768, false, 20900);
 			}
 			else if (event.equalsIgnoreCase("28"))
 			{
-				autoChat(npc, messages[22], Say2.NPC_ALL);
+				autoChat(npc, MESSAGES[22], Say2.NPC_ALL);
 				startQuestTimer("social1", 1, npc, null);
 			}
 			else if (event.equalsIgnoreCase("29"))
@@ -482,7 +490,7 @@ public class MC_Show extends L2AttackableAIScript
 			}
 			else if (event.equalsIgnoreCase("clean_npc"))
 			{
-				isStarted = false;
+				IS_STARTED = false;
 				npc.deleteMe();
 			}
 			else
@@ -512,6 +520,6 @@ public class MC_Show extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new MC_Show(-1, "MC_Show", "fantasy_isle");
+		new MC_Show(MC_Show.class.getSimpleName(), "ai");
 	}
 }

+ 114 - 64
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/BeastFarm.java

@@ -18,6 +18,7 @@ import java.util.Map;
 
 import javolution.util.FastMap;
 import quests.Q00020_BringUpWithLove.Q00020_BringUpWithLove;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcTable;
@@ -42,7 +43,7 @@ import com.l2jserver.gameserver.util.Util;
  * Updated to Freya.
  * @author Fulminus, Gigiikun
  */
-public class BeastFarm extends L2AttackableAIScript
+public class BeastFarm extends AbstractNpcAI
 {
 	private static final int GOLDEN_SPICE = 15474;
 	private static final int CRYSTAL_SPICE = 15475;
@@ -54,78 +55,58 @@ public class BeastFarm extends L2AttackableAIScript
 	private static final int SKILL_SGRADE_CRYSTAL_SPICE = 9054;
 	private static final int[] TAMED_BEASTS =
 	{
-		18869, 18870, 18871, 18872
+		18869,
+		18870,
+		18871,
+		18872
 	};
 	private static final int TAME_CHANCE = 20;
 	protected static final int[] SPECIAL_SPICE_CHANCES =
 	{
-		33, 75
+		33,
+		75
 	};
 	
 	// all mobs that can eat...
 	private static final int[] FEEDABLE_BEASTS =
 	{
-		18873, 18874, 18875, 18876, 18877, 18878, 18879, 18880, 18881, 18882, 18883, 18884, 18885, 18886, 18887, 18888, 18889, 18890, 18891, 18892, 18893, 18894, 18895, 18896, 18897, 18898, 18899, 18900
+		18873,
+		18874,
+		18875,
+		18876,
+		18877,
+		18878,
+		18879,
+		18880,
+		18881,
+		18882,
+		18883,
+		18884,
+		18885,
+		18886,
+		18887,
+		18888,
+		18889,
+		18890,
+		18891,
+		18892,
+		18893,
+		18894,
+		18895,
+		18896,
+		18897,
+		18898,
+		18899,
+		18900
 	};
 	
 	private static Map<Integer, Integer> _FeedInfo = new FastMap<>();
 	private static Map<Integer, GrowthCapableMob> _GrowthCapableMobs = new FastMap<>();
 	private static Map<String, SkillHolder[]> _TamedBeastsData = new FastMap<>();
 	
-	// all mobs that grow by eating
-	private static class GrowthCapableMob
-	{
-		private final int _chance;
-		private final int _growthLevel;
-		private final int _tameNpcId;
-		private final Map<Integer, Integer> _skillSuccessNpcIdList = new FastMap<>();
-		
-		public GrowthCapableMob(int chance, int growthLevel, int tameNpcId)
-		{
-			_chance = chance;
-			_growthLevel = growthLevel;
-			_tameNpcId = tameNpcId;
-		}
-		
-		public void addNpcIdForSkillId(int skillId, int npcId)
-		{
-			_skillSuccessNpcIdList.put(skillId, npcId);
-		}
-		
-		public int getGrowthLevel()
-		{
-			return _growthLevel;
-		}
-		
-		public int getLeveledNpcId(int skillId)
-		{
-			if (!_skillSuccessNpcIdList.containsKey(skillId))
-				return -1;
-			else if (skillId == SKILL_BLESSED_GOLDEN_SPICE || skillId == SKILL_BLESSED_CRYSTAL_SPICE || skillId == SKILL_SGRADE_GOLDEN_SPICE || skillId == SKILL_SGRADE_CRYSTAL_SPICE)
-			{
-				if (getRandom(100) < SPECIAL_SPICE_CHANCES[0])
-				{
-					if (getRandom(100) < SPECIAL_SPICE_CHANCES[1])
-						return _skillSuccessNpcIdList.get(skillId);
-					else if (skillId == SKILL_BLESSED_GOLDEN_SPICE || skillId == SKILL_SGRADE_GOLDEN_SPICE)
-						return _skillSuccessNpcIdList.get(SKILL_GOLDEN_SPICE);
-					else
-						return _skillSuccessNpcIdList.get(SKILL_CRYSTAL_SPICE);
-				}
-				return -1;
-			}
-			else if (_growthLevel == 2 && getRandom(100) < TAME_CHANCE)
-				return _tameNpcId;
-			else if (getRandom(100) < _chance)
-				return _skillSuccessNpcIdList.get(skillId);
-			else
-				return -1;
-		}
-	}
-	
-	public BeastFarm(int questId, String name, String descr)
+	private BeastFarm(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		registerMobs(FEEDABLE_BEASTS, QuestEventType.ON_KILL, QuestEventType.ON_SKILL_SEE);
 		
 		GrowthCapableMob temp;
@@ -271,7 +252,9 @@ public class BeastFarm extends L2AttackableAIScript
 		if (_FeedInfo.containsKey(npc.getObjectId()))
 		{
 			if (_FeedInfo.get(npc.getObjectId()) == player.getObjectId())
+			{
 				_FeedInfo.remove(npc.getObjectId());
+			}
 		}
 		// despawn the old mob
 		// TODO: same code? FIXED?
@@ -308,11 +291,13 @@ public class BeastFarm extends L2AttackableAIScript
 			nextNpc.setName(name);
 			nextNpc.broadcastPacket(new AbstractNpcInfo.NpcInfo(nextNpc, player));
 			for (SkillHolder sh : skillList)
+			{
 				nextNpc.addBeastSkill(SkillTable.getInstance().getInfo(sh.getSkillId(), sh.getSkillLvl()));
+			}
 			nextNpc.setRunning();
 			
 			QuestState st = player.getQuestState(Q00020_BringUpWithLove.class.getSimpleName());
-			if (st != null && st.getInt("cond") == 1 && !st.hasQuestItems(7185) && getRandom(10) == 1)
+			if ((st != null) && (st.getInt("cond") == 1) && !st.hasQuestItems(7185) && (getRandom(10) == 1))
 			{
 				// if player has quest 20 going, give quest item
 				// it's easier to hardcode it in here than to try and repeat this stuff in the quest
@@ -354,7 +339,7 @@ public class BeastFarm extends L2AttackableAIScript
 		int npcId = npc.getNpcId();
 		int skillId = skill.getId();
 		// check if the npc and skills used are valid for this script. Exit if invalid.
-		if (!Util.contains(FEEDABLE_BEASTS, npcId) || (skillId != SKILL_GOLDEN_SPICE && skillId != SKILL_CRYSTAL_SPICE && skillId != SKILL_BLESSED_GOLDEN_SPICE && skillId != SKILL_BLESSED_CRYSTAL_SPICE && skillId != SKILL_SGRADE_GOLDEN_SPICE && skillId != SKILL_SGRADE_CRYSTAL_SPICE))
+		if (!Util.contains(FEEDABLE_BEASTS, npcId) || ((skillId != SKILL_GOLDEN_SPICE) && (skillId != SKILL_CRYSTAL_SPICE) && (skillId != SKILL_BLESSED_GOLDEN_SPICE) && (skillId != SKILL_BLESSED_CRYSTAL_SPICE) && (skillId != SKILL_SGRADE_GOLDEN_SPICE) && (skillId != SKILL_SGRADE_CRYSTAL_SPICE)))
 		{
 			return super.onSkillSee(npc, caster, skill, targets, isPet);
 		}
@@ -369,7 +354,7 @@ public class BeastFarm extends L2AttackableAIScript
 		
 		// prevent exploit which allows 2 players to simultaneously raise the same 0-growth beast
 		// If the mob is at 0th level (when it still listens to all feeders) lock it to the first feeder!
-		if (growthLevel == 0 && _FeedInfo.containsKey(objectId))
+		if ((growthLevel == 0) && _FeedInfo.containsKey(objectId))
 		{
 			return super.onSkillSee(npc, caster, skill, targets, isPet);
 		}
@@ -380,11 +365,11 @@ public class BeastFarm extends L2AttackableAIScript
 		npc.broadcastSocialAction(2);
 		
 		int food = 0;
-		if (skillId == SKILL_GOLDEN_SPICE || skillId == SKILL_BLESSED_GOLDEN_SPICE)
+		if ((skillId == SKILL_GOLDEN_SPICE) || (skillId == SKILL_BLESSED_GOLDEN_SPICE))
 		{
 			food = GOLDEN_SPICE;
 		}
-		else if (skillId == SKILL_CRYSTAL_SPICE || skillId == SKILL_BLESSED_CRYSTAL_SPICE)
+		else if ((skillId == SKILL_CRYSTAL_SPICE) || (skillId == SKILL_BLESSED_CRYSTAL_SPICE))
 		{
 			food = CRYSTAL_SPICE;
 		}
@@ -405,7 +390,7 @@ public class BeastFarm extends L2AttackableAIScript
 				}
 				return super.onSkillSee(npc, caster, skill, targets, isPet);
 			}
-			else if (growthLevel > 0 && _FeedInfo.get(objectId) != caster.getObjectId())
+			else if ((growthLevel > 0) && (_FeedInfo.get(objectId) != caster.getObjectId()))
 			{
 				// check if this is the same player as the one who raised it from growth 0.
 				// if no, then do not allow a chance to raise the pet (food gets consumed but has no effect).
@@ -432,8 +417,73 @@ public class BeastFarm extends L2AttackableAIScript
 		return super.onKill(npc, killer, isPet);
 	}
 	
+	// all mobs that grow by eating
+	private static class GrowthCapableMob
+	{
+		private final int _chance;
+		private final int _growthLevel;
+		private final int _tameNpcId;
+		private final Map<Integer, Integer> _skillSuccessNpcIdList = new FastMap<>();
+		
+		public GrowthCapableMob(int chance, int growthLevel, int tameNpcId)
+		{
+			_chance = chance;
+			_growthLevel = growthLevel;
+			_tameNpcId = tameNpcId;
+		}
+		
+		public void addNpcIdForSkillId(int skillId, int npcId)
+		{
+			_skillSuccessNpcIdList.put(skillId, npcId);
+		}
+		
+		public int getGrowthLevel()
+		{
+			return _growthLevel;
+		}
+		
+		public int getLeveledNpcId(int skillId)
+		{
+			if (!_skillSuccessNpcIdList.containsKey(skillId))
+			{
+				return -1;
+			}
+			else if ((skillId == SKILL_BLESSED_GOLDEN_SPICE) || (skillId == SKILL_BLESSED_CRYSTAL_SPICE) || (skillId == SKILL_SGRADE_GOLDEN_SPICE) || (skillId == SKILL_SGRADE_CRYSTAL_SPICE))
+			{
+				if (getRandom(100) < SPECIAL_SPICE_CHANCES[0])
+				{
+					if (getRandom(100) < SPECIAL_SPICE_CHANCES[1])
+					{
+						return _skillSuccessNpcIdList.get(skillId);
+					}
+					else if ((skillId == SKILL_BLESSED_GOLDEN_SPICE) || (skillId == SKILL_SGRADE_GOLDEN_SPICE))
+					{
+						return _skillSuccessNpcIdList.get(SKILL_GOLDEN_SPICE);
+					}
+					else
+					{
+						return _skillSuccessNpcIdList.get(SKILL_CRYSTAL_SPICE);
+					}
+				}
+				return -1;
+			}
+			else if ((_growthLevel == 2) && (getRandom(100) < TAME_CHANCE))
+			{
+				return _tameNpcId;
+			}
+			else if (getRandom(100) < _chance)
+			{
+				return _skillSuccessNpcIdList.get(skillId);
+			}
+			else
+			{
+				return -1;
+			}
+		}
+	}
+	
 	public static void main(String[] args)
 	{
-		new BeastFarm(-1, BeastFarm.class.getSimpleName(), "ai");
+		new BeastFarm(BeastFarm.class.getSimpleName(), "ai");
 	}
 }

+ 9 - 7
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Chests.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Character;
@@ -27,7 +29,7 @@ import com.l2jserver.gameserver.util.Util;
  * Chest AI implementation.
  * @author Fulminus
  */
-public class Chests extends L2AttackableAIScript
+public class Chests extends AbstractNpcAI
 {
 	private static final int SKILL_DELUXE_KEY = 2229;
 	
@@ -106,11 +108,9 @@ public class Chests extends L2AttackableAIScript
 		21822
 	};
 	
-	public Chests(int questId, String name, String descr)
+	private Chests(String name, String descr)
 	{
-		// firstly, don't forget to call the parent constructor to prepare the event triggering
-		// mechanisms etc.
-		super(questId, name, descr);
+		super(name, descr);
 		registerMobs(NPC_IDS, QuestEventType.ON_ATTACK, QuestEventType.ON_SKILL_SEE);
 	}
 	
@@ -149,8 +149,10 @@ public class Chests extends L2AttackableAIScript
 						int keyLevelNeeded = chest.getLevel() / 10;
 						keyLevelNeeded -= skillLevel;
 						if (keyLevelNeeded < 0)
+						{
 							keyLevelNeeded *= -1;
-						int chance = BASE_CHANCE - keyLevelNeeded * LEVEL_DECREASE;
+						}
+						int chance = BASE_CHANCE - (keyLevelNeeded * LEVEL_DECREASE);
 						
 						// success, pretend-death with rewards: chest.reduceCurrentHp(99999999, player)
 						if (getRandom(100) < chance)
@@ -213,6 +215,6 @@ public class Chests extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new Chests(-1, Chests.class.getSimpleName(), "ai");
+		new Chests(Chests.class.getSimpleName(), "ai");
 	}
 }

+ 15 - 14
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Chimeras.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.instancemanager.HellboundManager;
 import com.l2jserver.gameserver.model.L2Object;
@@ -27,12 +29,15 @@ import com.l2jserver.gameserver.model.skills.L2Skill;
  * Chimeras AI.
  * @author DS
  */
-public class Chimeras extends L2AttackableAIScript
+public class Chimeras extends AbstractNpcAI
 {
 	// NPCs
 	private static final int[] NPCS =
 	{
-		22349, 22350, 22351, 22352
+		22349,
+		22350,
+		22351,
+		22352
 	};
 	private static final int CELTUS = 22353;
 	
@@ -51,6 +56,14 @@ public class Chimeras extends L2AttackableAIScript
 	private static final int LIFE_FORCE = 9681;
 	private static final int CONTAINED_LIFE_FORCE = 9682;
 	
+	private Chimeras(int questId, String name, String descr)
+	{
+		super(name, descr);
+		addSkillSeeId(NPCS);
+		addSpawnId(CELTUS);
+		addSkillSeeId(CELTUS);
+	}
+	
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
@@ -121,18 +134,6 @@ public class Chimeras extends L2AttackableAIScript
 		}
 	}
 	
-	public Chimeras(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		for (int npcId : NPCS)
-		{
-			addSkillSeeId(npcId);
-		}
-		
-		addSpawnId(CELTUS);
-		addSkillSeeId(CELTUS);
-	}
-	
 	public static void main(String[] args)
 	{
 		new Chimeras(-1, Chimeras.class.getSimpleName(), "ai");

+ 49 - 36
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DenOfEvil.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
@@ -31,32 +33,37 @@ import com.l2jserver.gameserver.util.Util;
  * Dummy AI for spawns/respawns only for testing.
  * @author Gnacik
  */
-public class DenOfEvil extends L2AttackableAIScript
+public class DenOfEvil extends AbstractNpcAI
 {
 	// private static final int _buffer_id = 32656;
 	
-	protected static final int[] _eye_ids = { 18812, 18813, 18814 };
-	private static final int _skill_id = 6150; // others +2
+	protected static final int[] EYE_IDS =
+	{
+		18812,
+		18813,
+		18814
+	};
+	private static final int SKILL_ID = 6150; // others +2
 	
-	private static final Location[] _eye_spawn =
+	private static final Location[] EYE_SPAWNS =
 	{
 		new Location(71544, -129400, -3360, 16472),
-		new Location(70954, -128854, -3360,    16),
+		new Location(70954, -128854, -3360, 16),
 		new Location(72145, -128847, -3368, 32832),
 		new Location(76147, -128372, -3144, 16152),
 		new Location(71573, -128309, -3360, 49152),
-		new Location(75211, -127441, -3152,     0),
+		new Location(75211, -127441, -3152, 0),
 		new Location(77005, -127406, -3144, 32784),
 		new Location(75965, -126486, -3144, 49120),
 		new Location(70972, -126429, -3016, 19208),
-		new Location(69916, -125838, -3024,  2840),
+		new Location(69916, -125838, -3024, 2840),
 		new Location(71658, -125459, -3016, 35136),
 		new Location(70605, -124646, -3040, 52104),
 		new Location(67283, -123237, -2912, 12376),
 		new Location(68383, -122754, -2912, 27904),
 		new Location(74137, -122733, -3024, 13272),
 		new Location(66736, -122007, -2896, 60576),
-		new Location(73289, -121769, -3024,  1024),
+		new Location(73289, -121769, -3024, 1024),
 		new Location(67894, -121491, -2912, 43872),
 		new Location(75530, -121477, -3008, 34424),
 		new Location(74117, -120459, -3024, 52344),
@@ -68,11 +75,11 @@ public class DenOfEvil extends L2AttackableAIScript
 		new Location(74312, -117583, -2272, 15280),
 		new Location(63276, -117409, -3064, 24760),
 		new Location(68104, -117192, -2168, 15888),
-		new Location(73758, -116945, -2216,     0),
+		new Location(73758, -116945, -2216, 0),
 		new Location(74944, -116858, -2220, 30892),
 		new Location(61715, -116623, -3064, 59888),
 		new Location(69140, -116464, -2168, 28952),
-		new Location(67311, -116374, -2152,  1280),
+		new Location(67311, -116374, -2152, 1280),
 		new Location(62459, -116370, -3064, 48624),
 		new Location(74475, -116260, -2216, 47456),
 		new Location(68333, -115015, -2168, 45136),
@@ -81,50 +88,50 @@ public class DenOfEvil extends L2AttackableAIScript
 		new Location(67062, -107125, -1144, 64008),
 		new Location(68893, -106954, -1160, 36704),
 		new Location(63848, -106771, -2384, 32784),
-		new Location(62372, -106514, -2384,     0),
+		new Location(62372, -106514, -2384, 0),
 		new Location(67838, -106143, -1160, 51232),
 		new Location(62905, -106109, -2384, 51288)
 	};
 	
-	private int getSkillIdByNpcId(int npcId)
+	private DenOfEvil(String name, String descr)
 	{
-		int diff = npcId - _eye_ids[0];
-		diff *= 2;
-		return _skill_id + diff;
+		super(name, descr);
+		registerMobs(EYE_IDS, QuestEventType.ON_KILL, QuestEventType.ON_SPAWN);
+		spawnEyes();
 	}
 	
-	public DenOfEvil(int questId, String name, String descr)
+	private int getSkillIdByNpcId(int npcId)
 	{
-		super(questId, name, descr);
-		
-		registerMobs(_eye_ids, QuestEventType.ON_KILL, QuestEventType.ON_SPAWN);
-		
-		spawnEyes();
+		int diff = npcId - EYE_IDS[0];
+		diff *= 2;
+		return SKILL_ID + diff;
 	}
 	
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (Util.contains(_eye_ids, npc.getNpcId()))
+		if (Util.contains(EYE_IDS, npc.getNpcId()))
 		{
 			npc.disableCoreAI(true);
 			npc.setIsImmobilized(true);
 			L2EffectZone zone = ZoneManager.getInstance().getZone(npc, L2EffectZone.class);
 			if (zone == null)
 			{
-				_log.warning("NPC "+npc+" spawned outside of L2EffectZone, check your zone coords! X:"+npc.getX()+" Y:"+npc.getY()+" Z:"+npc.getZ());
+				_log.warning("NPC " + npc + " spawned outside of L2EffectZone, check your zone coords! X:" + npc.getX() + " Y:" + npc.getY() + " Z:" + npc.getZ());
 				return null;
 			}
 			int skillId = getSkillIdByNpcId(npc.getNpcId());
 			int skillLevel = zone.getSkillLevel(skillId);
-			zone.addSkill(skillId, skillLevel+1);
+			zone.addSkill(skillId, skillLevel + 1);
 			if (skillLevel == 3) // 3+1=4
 			{
-				ThreadPoolManager.getInstance().scheduleAi(new KashaDestruction(zone), 2*60*1000l);
+				ThreadPoolManager.getInstance().scheduleAi(new KashaDestruction(zone), 2 * 60 * 1000l);
 				zone.broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.KASHA_EYE_PITCHES_TOSSES_EXPLODE));
 			}
-			else if (skillLevel == 2) // 2+1=3
+			else if (skillLevel == 2)
+			{
 				zone.broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.I_CAN_FEEL_ENERGY_KASHA_EYE_GETTING_STRONGER_RAPIDLY));
+			}
 		}
 		return null;
 	}
@@ -132,13 +139,13 @@ public class DenOfEvil extends L2AttackableAIScript
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
-		if (Util.contains(_eye_ids, npc.getNpcId()))
+		if (Util.contains(EYE_IDS, npc.getNpcId()))
 		{
 			ThreadPoolManager.getInstance().scheduleAi(new RespawnNewEye(npc.getLocation()), 15000);
 			L2EffectZone zone = ZoneManager.getInstance().getZone(npc, L2EffectZone.class);
 			if (zone == null)
 			{
-				_log.warning("NPC "+npc+" killed outside of L2EffectZone, check your zone coords! X:"+npc.getX()+" Y:"+npc.getY()+" Z:"+npc.getZ());
+				_log.warning("NPC " + npc + " killed outside of L2EffectZone, check your zone coords! X:" + npc.getX() + " Y:" + npc.getY() + " Z:" + npc.getZ());
 				return null;
 			}
 			int skillId = getSkillIdByNpcId(npc.getNpcId());
@@ -150,15 +157,17 @@ public class DenOfEvil extends L2AttackableAIScript
 	
 	private void spawnEyes()
 	{
-		for(Location loc : _eye_spawn)
-			addSpawn(_eye_ids[getRandom(_eye_ids.length)], loc, false, 0);
+		for (Location loc : EYE_SPAWNS)
+		{
+			addSpawn(EYE_IDS[getRandom(EYE_IDS.length)], loc, false, 0);
+		}
 	}
 	
 	private class RespawnNewEye implements Runnable
 	{
 		private final Location _loc;
 		
-		public RespawnNewEye(Location loc) 
+		public RespawnNewEye(Location loc)
 		{
 			_loc = loc;
 		}
@@ -166,7 +175,7 @@ public class DenOfEvil extends L2AttackableAIScript
 		@Override
 		public void run()
 		{
-			addSpawn(_eye_ids[getRandom(_eye_ids.length)], _loc, false, 0);
+			addSpawn(EYE_IDS[getRandom(EYE_IDS.length)], _loc, false, 0);
 		}
 	}
 	
@@ -182,7 +191,7 @@ public class DenOfEvil extends L2AttackableAIScript
 		@Override
 		public void run()
 		{
-			for (int i = _skill_id; i <= _skill_id + 4; i = i + 2 )
+			for (int i = SKILL_ID; i <= (SKILL_ID + 4); i = i + 2)
 			{
 				// test 3 skills if some is lvl 4
 				if (_zone.getSkillLevel(i) > 3)
@@ -198,7 +207,9 @@ public class DenOfEvil extends L2AttackableAIScript
 			for (L2Character character : _zone.getCharactersInside())
 			{
 				if (character == null)
+				{
 					continue;
+				}
 				if (character.isPlayable())
 				{
 					L2Skill skill = SkillTable.getInstance().getInfo(6149, 1);
@@ -212,13 +223,15 @@ public class DenOfEvil extends L2AttackableAIScript
 						{
 							// respawn eye
 							L2Npc npc = (L2Npc) character;
-							if (Util.contains(_eye_ids, npc.getNpcId()))
+							if (Util.contains(EYE_IDS, npc.getNpcId()))
+							{
 								ThreadPoolManager.getInstance().scheduleAi(new RespawnNewEye(npc.getLocation()), 15000);
+							}
 						}
 					}
 				}
 			}
-			for (int i = _skill_id; i <= _skill_id + 4; i = i + 2 )
+			for (int i = SKILL_ID; i <= (SKILL_ID + 4); i = i + 2)
 			{
 				_zone.removeSkill(i);
 			}
@@ -227,6 +240,6 @@ public class DenOfEvil extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new DenOfEvil(-1, DenOfEvil.class.getSimpleName(), "ai");
+		new DenOfEvil(DenOfEvil.class.getSimpleName(), "ai");
 	}
 }

+ 174 - 83
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/EnergySeeds.java

@@ -18,6 +18,7 @@ import java.util.Map;
 
 import javolution.util.FastMap;
 import quests.Q00692_HowtoOpposeEvil.Q00692_HowtoOpposeEvil;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ThreadPoolManager;
@@ -46,7 +47,7 @@ import com.l2jserver.gameserver.util.Util;
  * Energy Seeds AI.
  * @author Gigiikun
  */
-public class EnergySeeds extends L2AttackableAIScript
+public class EnergySeeds extends AbstractNpcAI
 {
 	private static final int HOWTOOPPOSEEVIL_CHANCE = 60;
 	private static final int RATE = 1;
@@ -56,21 +57,76 @@ public class EnergySeeds extends L2AttackableAIScript
 	protected static Map<L2Npc, Integer> _spawnedNpcs = new FastMap<L2Npc, Integer>().shared();
 	
 	private static final int TEMPORARY_TELEPORTER = 32602;
-	private static final int[] SEEDIDS = { 18678, 18679, 18680, 18681, 18682, 18683 };
-	private static final int[][] ANNIHILATION_SUPRISE_MOB_IDS = { {22746,22747,22748,22749},
-		{22754,22755,22756}, {22760,22761,22762}
+	private static final int[] SEEDIDS =
+	{
+		18678,
+		18679,
+		18680,
+		18681,
+		18682,
+		18683
+	};
+	
+	private static final int[][] ANNIHILATION_SUPRISE_MOB_IDS =
+	{
+		{
+			22746,
+			22747,
+			22748,
+			22749
+		},
+		{
+			22754,
+			22755,
+			22756
+		},
+		{
+			22760,
+			22761,
+			22762
+		}
 	};
 	
-	private static int[] SEED_OF_DESTRUCTION_DOORS = 
+	private static int[] SEED_OF_DESTRUCTION_DOORS =
 	{
-		12240003,12240004,12240005,12240006,12240007,12240008,
-		12240009,12240010,12240011,12240012,12240013,12240014,
-		12240015,12240016,12240017,12240018,12240019,12240020,
-		12240021,12240022,12240023,12240024,12240025,12240026,
-		12240027,12240028,12240029,12240030,12240031
+		12240003,
+		12240004,
+		12240005,
+		12240006,
+		12240007,
+		12240008,
+		12240009,
+		12240010,
+		12240011,
+		12240012,
+		12240013,
+		12240014,
+		12240015,
+		12240016,
+		12240017,
+		12240018,
+		12240019,
+		12240020,
+		12240021,
+		12240022,
+		12240023,
+		12240024,
+		12240025,
+		12240026,
+		12240027,
+		12240028,
+		12240029,
+		12240030,
+		12240031
 	};
+	
 	private static final int SOD_ZONE = 60009;
-	private static final int[] SOD_EXIT_POINT = { -248717, 250260, 4337 };
+	private static final int[] SOD_EXIT_POINT =
+	{
+		-248717,
+		250260,
+		4337
+	};
 	
 	private enum GraciaSeeds
 	{
@@ -81,46 +137,11 @@ public class EnergySeeds extends L2AttackableAIScript
 		ANNIHILATION_COKRAKON
 	}
 	
-	private class ESSpawn
-	{
-		protected final int _spawnId;
-		protected final GraciaSeeds _seedId;
-		protected final int[] _npcIds;
-		protected final Location _loc;
-		
-		public ESSpawn(int spawnId, GraciaSeeds seedId, Location loc, int[] npcIds)
-		{
-			_spawnId = spawnId;
-			_seedId = seedId;
-			_loc = loc;
-			_npcIds = npcIds;
-		}
-		
-		public void scheduleRespawn(long waitTime)
-		{
-			ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
-			{
-				@Override
-				public void run()
-				{
-					// if the AI is inactive, do not spawn the NPC
-					if (isSeedActive(_seedId))
-					{
-						//get a random NPC that should spawn at this location
-						Integer spawnId = _spawnId; // the map uses "Integer", not "int"
-						_spawnedNpcs.put(addSpawn(_npcIds[getRandom(_npcIds.length)], _loc, false, 0), spawnId);
-					}
-				}
-			}, waitTime);
-		}
-	}
-	
-	public EnergySeeds(int questId, String name, String descr)
+	private EnergySeeds(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		registerMobs(SEEDIDS);
-		for(int i : SEEDIDS)
-			addFirstTalkId(i);
+		addFirstTalkId(SEEDIDS);
 		addFirstTalkId(TEMPORARY_TELEPORTER);
 		addEnterZoneId(SOD_ZONE);
 		addSpawnsToList();
@@ -129,7 +150,7 @@ public class EnergySeeds extends L2AttackableAIScript
 	
 	protected boolean isSeedActive(GraciaSeeds seed)
 	{
-		switch(seed)
+		switch (seed)
 		{
 			case INFINITY:
 				return false;
@@ -144,40 +165,42 @@ public class EnergySeeds extends L2AttackableAIScript
 	}
 	
 	@Override
-	public String onSkillSee (L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
+	public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
 	{
-		if (!Util.contains(targets, npc) || skill.getId() != 5780)
+		if (!Util.contains(targets, npc) || (skill.getId() != 5780))
+		{
 			return super.onSkillSee(npc, caster, skill, targets, isPet);
+		}
 		
 		npc.deleteMe();
 		
 		if (_spawnedNpcs.containsKey(npc) && _spawns.containsKey(_spawnedNpcs.get(npc)))
 		{
 			ESSpawn spawn = _spawns.get(_spawnedNpcs.get(npc));
-			spawn.scheduleRespawn(RESPAWN+getRandom(RANDOM_RESPAWN_OFFSET));
+			spawn.scheduleRespawn(RESPAWN + getRandom(RANDOM_RESPAWN_OFFSET));
 			_spawnedNpcs.remove(npc);
 			if (isSeedActive(spawn._seedId))
 			{
 				int itemId = 0;
 				
-				switch(npc.getNpcId())
+				switch (npc.getNpcId())
 				{
-					case 18678: //Water
+					case 18678: // Water
 						itemId = 14016;
 						break;
-					case 18679: //Fire
+					case 18679: // Fire
 						itemId = 14015;
 						break;
-					case 18680: //Wind
+					case 18680: // Wind
 						itemId = 14017;
 						break;
-					case 18681: //Earth
+					case 18681: // Earth
 						itemId = 14018;
 						break;
-					case 18682: //Divinity
+					case 18682: // Divinity
 						itemId = 14020;
 						break;
-					case 18683: //Darkness
+					case 18683: // Darkness
 						itemId = 14019;
 						break;
 					default:
@@ -201,7 +224,7 @@ public class EnergySeeds extends L2AttackableAIScript
 	}
 	
 	@Override
-	public String onAdvEvent (String event, L2Npc npc, L2PcInstance player)
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
 		if (event.equalsIgnoreCase("StartSoDAi"))
 		{
@@ -225,7 +248,7 @@ public class EnergySeeds extends L2AttackableAIScript
 					doorInstance.closeMe();
 				}
 			}
-			for(L2PcInstance ch : ZoneManager.getInstance().getZoneById(SOD_ZONE).getPlayersInside())
+			for (L2PcInstance ch : ZoneManager.getInstance().getZoneById(SOD_ZONE).getPlayersInside())
 			{
 				if (ch != null)
 				{
@@ -249,10 +272,12 @@ public class EnergySeeds extends L2AttackableAIScript
 	}
 	
 	@Override
-	public String onFirstTalk (L2Npc npc, L2PcInstance player)
+	public String onFirstTalk(L2Npc npc, L2PcInstance player)
 	{
 		if (npc.getNpcId() == TEMPORARY_TELEPORTER)
+		{
 			player.teleToLocation(SOD_EXIT_POINT[0], SOD_EXIT_POINT[1], SOD_EXIT_POINT[2]);
+		}
 		player.sendPacket(ActionFailed.STATIC_PACKET);
 		return null;
 	}
@@ -262,7 +287,7 @@ public class EnergySeeds extends L2AttackableAIScript
 	{
 		if (_spawnedNpcs.containsKey(npc) && _spawns.containsKey(_spawnedNpcs.get(npc)))
 		{
-			_spawns.get(_spawnedNpcs.get(npc)).scheduleRespawn(RESPAWN+getRandom(RANDOM_RESPAWN_OFFSET));
+			_spawns.get(_spawnedNpcs.get(npc)).scheduleRespawn(RESPAWN + getRandom(RANDOM_RESPAWN_OFFSET));
 			_spawnedNpcs.remove(npc);
 		}
 		return super.onKill(npc, player, isPet);
@@ -272,89 +297,117 @@ public class EnergySeeds extends L2AttackableAIScript
 	public String onEnterZone(L2Character character, L2ZoneType zone)
 	{
 		if (character.getInstanceId() != 0)
-			return super.onEnterZone(character,zone);
+		{
+			return super.onEnterZone(character, zone);
+		}
 		
 		if (character instanceof L2PcInstance)
 		{
-			switch(zone.getId())
+			switch (zone.getId())
 			{
 				case SOD_ZONE:
 					if (!isSeedActive(GraciaSeeds.DESTRUCTION) && !character.isGM())
+					{
 						character.teleToLocation(SOD_EXIT_POINT[0], SOD_EXIT_POINT[1], SOD_EXIT_POINT[2]);
+					}
 					break;
 			}
 		}
-		return super.onEnterZone(character,zone);
+		return super.onEnterZone(character, zone);
 	}
 	
 	public void startAI()
 	{
 		// spawn all NPCs
 		for (ESSpawn spawn : _spawns.values())
+		{
 			if (isSeedActive(spawn._seedId))
+			{
 				spawn.scheduleRespawn(0);
+			}
+		}
 	}
 	
 	public void startAI(GraciaSeeds type)
 	{
 		// spawn all NPCs
 		for (ESSpawn spawn : _spawns.values())
+		{
 			if (spawn._seedId == type)
+			{
 				spawn.scheduleRespawn(0);
+			}
+		}
 	}
 	
 	public void stopAI(GraciaSeeds type)
 	{
 		for (L2Npc seed : _spawnedNpcs.keySet())
+		{
 			if (type == _spawns.get(_spawnedNpcs.get(seed))._seedId)
+			{
 				seed.deleteMe();
+			}
+		}
 	}
 	
 	public void seedCollectEvent(L2PcInstance player, L2Npc seedEnergy, GraciaSeeds seedType)
 	{
 		if (player == null)
+		{
 			return;
+		}
 		QuestState st = player.getQuestState(Q00692_HowtoOpposeEvil.class.getSimpleName());
-		switch(seedType)
+		switch (seedType)
 		{
 			case INFINITY:
-				if (st != null && st.getInt("cond") == 3)
+				if ((st != null) && (st.getInt("cond") == 3))
+				{
 					handleQuestDrop(st, 13798);
+				}
 				break;
 			case DESTRUCTION:
-				if (st != null && st.getInt("cond") == 3)
+				if ((st != null) && (st.getInt("cond") == 3))
+				{
 					handleQuestDrop(st, 13867);
+				}
 				break;
 			case ANNIHILATION_BISTAKON:
-				if (st != null && st.getInt("cond") == 3)
+				if ((st != null) && (st.getInt("cond") == 3))
+				{
 					handleQuestDrop(st, 15535);
+				}
 				if (getRandom(100) < 50)
 				{
-					L2MonsterInstance mob = spawnSupriseMob(seedEnergy,ANNIHILATION_SUPRISE_MOB_IDS[0][getRandom(ANNIHILATION_SUPRISE_MOB_IDS[0].length)]);
+					L2MonsterInstance mob = spawnSupriseMob(seedEnergy, ANNIHILATION_SUPRISE_MOB_IDS[0][getRandom(ANNIHILATION_SUPRISE_MOB_IDS[0].length)]);
 					mob.setRunning();
-					mob.addDamageHate(player,0,999);
+					mob.addDamageHate(player, 0, 999);
 					mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
 				}
 				break;
 			case ANNIHILATION_REPTILIKON:
-				if (st != null && st.getInt("cond") == 3)
+				if ((st != null) && (st.getInt("cond") == 3))
+				{
 					handleQuestDrop(st, 15535);
+				}
 				if (getRandom(100) < 50)
 				{
-					L2MonsterInstance mob = spawnSupriseMob(seedEnergy,ANNIHILATION_SUPRISE_MOB_IDS[1][getRandom(ANNIHILATION_SUPRISE_MOB_IDS[1].length)]);
+					L2MonsterInstance mob = spawnSupriseMob(seedEnergy, ANNIHILATION_SUPRISE_MOB_IDS[1][getRandom(ANNIHILATION_SUPRISE_MOB_IDS[1].length)]);
 					mob.setRunning();
-					mob.addDamageHate(player,0,999);
+					mob.addDamageHate(player, 0, 999);
 					mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
 				}
 				break;
 			case ANNIHILATION_COKRAKON:
-				if (st != null && st.getInt("cond") == 3)
+				if ((st != null) && (st.getInt("cond") == 3))
+				{
 					handleQuestDrop(st, 15535);
+				}
 				if (getRandom(100) < 50)
 				{
-					L2MonsterInstance mob = spawnSupriseMob(seedEnergy,ANNIHILATION_SUPRISE_MOB_IDS[2][getRandom(ANNIHILATION_SUPRISE_MOB_IDS[2].length)]);
+					L2MonsterInstance mob = spawnSupriseMob(seedEnergy, ANNIHILATION_SUPRISE_MOB_IDS[2][getRandom(ANNIHILATION_SUPRISE_MOB_IDS[2].length)]);
 					mob.setRunning();
-					mob.addDamageHate(player,0,999);
+					mob.addDamageHate(player, 0, 999);
 					mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
 				}
 				break;
@@ -373,7 +426,7 @@ public class EnergySeeds extends L2AttackableAIScript
 		monster.setCurrentHpMp(monster.getMaxHp(), monster.getMaxMp());
 		monster.setHeading(energy.getHeading());
 		
-		//move monster to masters instance
+		// move monster to masters instance
 		monster.setInstanceId(energy.getInstanceId());
 		
 		monster.setShowSummonAnimation(true);
@@ -391,10 +444,12 @@ public class EnergySeeds extends L2AttackableAIScript
 		int numItems = (int) (chance / 100);
 		chance = chance % 100;
 		if (getRandom(100) < chance)
+		{
 			numItems++;
+		}
 		if (numItems > 0)
 		{
-			st.giveItems(itemId,numItems);
+			st.giveItems(itemId, numItems);
 			st.playSound("ItemSound.quest_itemget");
 		}
 	}
@@ -402,7 +457,8 @@ public class EnergySeeds extends L2AttackableAIScript
 	private void addSpawnsToList()
 	{
 		// Seed of Destruction
-		//Temporary Teleporters
+		// Temporary Teleporters
+		//@formatter:off
 		_spawns.put(1, new ESSpawn(1, GraciaSeeds.DESTRUCTION, new Location(-245790,220320,-12104), new int[]{TEMPORARY_TELEPORTER}));
 		_spawns.put(2, new ESSpawn(2, GraciaSeeds.DESTRUCTION, new Location(-249770,207300,-11952), new int[]{TEMPORARY_TELEPORTER}));
 		//Energy Seeds
@@ -733,10 +789,45 @@ public class EnergySeeds extends L2AttackableAIScript
 		_spawns.put(299, new ESSpawn(299, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219079,175021,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 }));
 		_spawns.put(300, new ESSpawn(300, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218812,174229,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 }));
 		_spawns.put(301, new ESSpawn(301, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218723,174669,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 }));
+		//@formatter:on
+	}
+	
+	private class ESSpawn
+	{
+		protected final int _spawnId;
+		protected final GraciaSeeds _seedId;
+		protected final int[] _npcIds;
+		protected final Location _loc;
+		
+		public ESSpawn(int spawnId, GraciaSeeds seedId, Location loc, int[] npcIds)
+		{
+			_spawnId = spawnId;
+			_seedId = seedId;
+			_loc = loc;
+			_npcIds = npcIds;
+		}
+		
+		public void scheduleRespawn(long waitTime)
+		{
+			ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
+			{
+				@Override
+				public void run()
+				{
+					// if the AI is inactive, do not spawn the NPC
+					if (isSeedActive(_seedId))
+					{
+						// get a random NPC that should spawn at this location
+						Integer spawnId = _spawnId; // the map uses "Integer", not "int"
+						_spawnedNpcs.put(addSpawn(_npcIds[getRandom(_npcIds.length)], _loc, false, 0), spawnId);
+					}
+				}
+			}, waitTime);
+		}
 	}
 	
 	public static void main(String[] args)
 	{
-		new EnergySeeds(-1, EnergySeeds.class.getSimpleName(), "instances");
+		new EnergySeeds(EnergySeeds.class.getSimpleName(), "instances");
 	}
 }

+ 6 - 5
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/EvasGiftBoxes.java

@@ -14,15 +14,16 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
 
 /**
  * Evas Gift Boxes AI.
  * @author Gigiikun
  */
-public class EvasGiftBoxes extends Quest
+public class EvasGiftBoxes extends AbstractNpcAI
 {
 	private static final int GIFTBOX = 32342;
 	
@@ -47,9 +48,9 @@ public class EvasGiftBoxes extends Quest
 		}
 	};
 	
-	public EvasGiftBoxes(int questId, String name, String descr)
+	private EvasGiftBoxes(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		addKillId(GIFTBOX);
 		addSpawnId(GIFTBOX);
 	}
@@ -84,6 +85,6 @@ public class EvasGiftBoxes extends Quest
 	
 	public static void main(String[] args)
 	{
-		new EvasGiftBoxes(-1, EvasGiftBoxes.class.getSimpleName(), "ai");
+		new EvasGiftBoxes(EvasGiftBoxes.class.getSimpleName(), "ai");
 	}
 }

+ 9 - 7
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FairyTrees.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -28,9 +30,9 @@ import com.l2jserver.util.Rnd;
  * Fairy Trees AI
  * @author Charus
  */
-public class FairyTrees extends L2AttackableAIScript
+public class FairyTrees extends AbstractNpcAI
 {
-	private static final int[] mobs =
+	private static final int[] MOBS =
 	{
 		27185,
 		27186,
@@ -38,10 +40,10 @@ public class FairyTrees extends L2AttackableAIScript
 		27188
 	};
 	
-	public FairyTrees(int questId, String name, String descr)
+	private FairyTrees(String name, String descr)
 	{
-		super(questId, name, descr);
-		registerMobs(mobs, QuestEventType.ON_KILL);
+		super(name, descr);
+		registerMobs(MOBS, QuestEventType.ON_KILL);
 		addSpawnId(27189);
 	}
 	
@@ -49,7 +51,7 @@ public class FairyTrees extends L2AttackableAIScript
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
 		int npcId = npc.getNpcId();
-		if (Util.contains(mobs, npcId))
+		if (Util.contains(MOBS, npcId))
 		{
 			for (int i = 0; i < 20; i++)
 			{
@@ -73,6 +75,6 @@ public class FairyTrees extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new FairyTrees(-1, FairyTrees.class.getSimpleName(), "ai");
+		new FairyTrees(FairyTrees.class.getSimpleName(), "ai");
 	}
 }

+ 197 - 101
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FeedableBeasts.java

@@ -18,6 +18,7 @@ import java.util.Map;
 
 import javolution.util.FastMap;
 import quests.Q00020_BringUpWithLove.Q00020_BringUpWithLove;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcTable;
@@ -37,75 +38,155 @@ import com.l2jserver.gameserver.util.Util;
  * Growth-capable mobs: Polymorphing upon successful feeding.
  * @author Fulminus
  */
-public class FeedableBeasts extends L2AttackableAIScript
+public class FeedableBeasts extends AbstractNpcAI
 {
 	private static final int GOLDEN_SPICE = 6643;
 	private static final int CRYSTAL_SPICE = 6644;
 	private static final int SKILL_GOLDEN_SPICE = 2188;
 	private static final int SKILL_CRYSTAL_SPICE = 2189;
-	private static final int[] TAMED_BEASTS = {16013, 16014, 16015, 16016, 16017, 16018};
+	private static final int[] TAMED_BEASTS =
+	{
+		16013,
+		16014,
+		16015,
+		16016,
+		16017,
+		16018
+	};
 	private static final int FOODSKILLDIFF = GOLDEN_SPICE - SKILL_GOLDEN_SPICE;
 	
 	// all mobs that can eat...
-	private static final int[] FEEDABLE_BEASTS = 
+	private static final int[] FEEDABLE_BEASTS =
 	{
-		21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,
-		21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,
-		21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,
-		21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,
-		21503,21504,21505,21506,21507,21824,21825,21826,21827,21828,21829,16013,16014,
-		16015,16016,16017,16018
+		21451,
+		21452,
+		21453,
+		21454,
+		21455,
+		21456,
+		21457,
+		21458,
+		21459,
+		21460,
+		21461,
+		21462,
+		21463,
+		21464,
+		21465,
+		21466,
+		21467,
+		21468,
+		21469,
+		21470,
+		21471,
+		21472,
+		21473,
+		21474,
+		21475,
+		21476,
+		21477,
+		21478,
+		21479,
+		21480,
+		21481,
+		21482,
+		21483,
+		21484,
+		21485,
+		21486,
+		21487,
+		21488,
+		21489,
+		21490,
+		21491,
+		21492,
+		21493,
+		21494,
+		21495,
+		21496,
+		21497,
+		21498,
+		21499,
+		21500,
+		21501,
+		21502,
+		21503,
+		21504,
+		21505,
+		21506,
+		21507,
+		21824,
+		21825,
+		21826,
+		21827,
+		21828,
+		21829,
+		16013,
+		16014,
+		16015,
+		16016,
+		16017,
+		16018
 	};
 	
-	private static final Map<Integer,Integer> MAD_COW_POLYMORPH = new FastMap<>();
-	
+	private static final Map<Integer, Integer> MAD_COW_POLYMORPH = new FastMap<>();
 	static
 	{
-		MAD_COW_POLYMORPH.put(21824,21468);
-		MAD_COW_POLYMORPH.put(21825,21469);
-		MAD_COW_POLYMORPH.put(21826,21487);
-		MAD_COW_POLYMORPH.put(21827,21488);
-		MAD_COW_POLYMORPH.put(21828,21506);
-		MAD_COW_POLYMORPH.put(21829,21507);
+		MAD_COW_POLYMORPH.put(21824, 21468);
+		MAD_COW_POLYMORPH.put(21825, 21469);
+		MAD_COW_POLYMORPH.put(21826, 21487);
+		MAD_COW_POLYMORPH.put(21827, 21488);
+		MAD_COW_POLYMORPH.put(21828, 21506);
+		MAD_COW_POLYMORPH.put(21829, 21507);
 	}
 	
-	//TODO: NpcString
+	// TODO: NpcString
 	private static final String[][] TEXT =
 	{
 		{
-			"What did you just do to me?","You want to tame me, huh?",
+			"What did you just do to me?",
+			"You want to tame me, huh?",
 			"Do not give me this. Perhaps you will be in danger.",
 			"Bah bah. What is this unpalatable thing?",
 			"My belly has been complaining.  This hit the spot.",
-			"What is this? Can I eat it?","You don't need to worry about me.",
-			"Delicious food, thanks.","I am starting to like you!","Gulp"
+			"What is this? Can I eat it?",
+			"You don't need to worry about me.",
+			"Delicious food, thanks.",
+			"I am starting to like you!",
+			"Gulp"
 		},
 		{
 			"I do not think you have given up on the idea of taming me.",
 			"That is just food to me.  Perhaps I can eat your hand too.",
-			"Will eating this make me fat? Ha ha","Why do you always feed me?",
+			"Will eating this make me fat? Ha ha",
+			"Why do you always feed me?",
 			"Do not trust me.  I may betray you"
 		},
 		{
-			"Destroy","Look what you have done!",
+			"Destroy",
+			"Look what you have done!",
 			"Strange feeling...!  Evil intentions grow in my heart...!",
-			"It is happenning!","This is sad...Good is sad...!"
+			"It is happenning!",
+			"This is sad...Good is sad...!"
 		}
 	};
 	
 	private static final String[] TAMED_TEXT =
 	{
-		"Refills! Yeah!","I am such a gluttonous beast, it is embarrassing! Ha ha",
+		"Refills! Yeah!",
+		"I am such a gluttonous beast, it is embarrassing! Ha ha",
 		"Your cooperative feeling has been getting better and better.",
-		"I will help you!","The weather is really good.  Wanna go for a picnic?",
+		"I will help you!",
+		"The weather is really good.  Wanna go for a picnic?",
 		"I really like you! This is tasty...",
 		"If you do not have to leave this place, then I can help you.",
-		"What can I help you with?","I am not here only for food!",
+		"What can I help you with?",
+		"I am not here only for food!",
 		"Yam, yam, yam, yam, yam!"
 	};
 	
-	private static Map<Integer,Integer> _FeedInfo = new FastMap<>();
-	private static Map<Integer,GrowthCapableMob> _GrowthCapableMobs = new FastMap<>();
+	private static Map<Integer, Integer> _FeedInfo = new FastMap<>();
+	private static Map<Integer, GrowthCapableMob> _GrowthCapableMobs = new FastMap<>();
 	
 	// all mobs that grow by eating
 	private static class GrowthCapableMob
@@ -126,7 +207,7 @@ public class FeedableBeasts extends L2AttackableAIScript
 			_spiceToMob.put(spice, Mobs);
 		}
 		
-		public Integer getMob(int spice,int mobType, int classType)
+		public Integer getMob(int spice, int mobType, int classType)
 		{
 			if (_spiceToMob.containsKey(spice))
 			{
@@ -154,13 +235,14 @@ public class FeedableBeasts extends L2AttackableAIScript
 		}
 	}
 	
-	public FeedableBeasts (int questId, String name, String descr)
+	private FeedableBeasts(String name, String descr)
 	{
-		super(questId, name, descr);
-		this.registerMobs(FEEDABLE_BEASTS, QuestEventType.ON_KILL, QuestEventType.ON_SKILL_SEE);
+		super(name, descr);
+		registerMobs(FEEDABLE_BEASTS, QuestEventType.ON_KILL, QuestEventType.ON_SKILL_SEE);
 		
 		GrowthCapableMob temp;
 		
+		//@formatter:off
 		final int[][] Kookabura_0_Gold = {{21452,21453, 21454, 21455}};
 		final int[][] Kookabura_0_Crystal = {{21456,21457, 21458, 21459}};
 		final int[][] Kookabura_1_Gold_1= {{21460,21462}};
@@ -187,147 +269,148 @@ public class FeedableBeasts extends L2AttackableAIScript
 		final int[][] Cougar_1_Crystal_2 = {{21503,21505}};
 		final int[][] Cougar_2_1 = {{21506,21828},{16015,16016}};
 		final int[][] Cougar_2_2 = {{21507,21829},{16015,16016}};
+		//@formatter:on
 		
 		// Alpen Kookabura
-		temp = new GrowthCapableMob(0,100);
-		temp.addMobs(GOLDEN_SPICE,Kookabura_0_Gold);
-		temp.addMobs(CRYSTAL_SPICE,Kookabura_0_Crystal);
+		temp = new GrowthCapableMob(0, 100);
+		temp.addMobs(GOLDEN_SPICE, Kookabura_0_Gold);
+		temp.addMobs(CRYSTAL_SPICE, Kookabura_0_Crystal);
 		_GrowthCapableMobs.put(21451, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(GOLDEN_SPICE,Kookabura_1_Gold_1);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(GOLDEN_SPICE, Kookabura_1_Gold_1);
 		_GrowthCapableMobs.put(21452, temp);
 		_GrowthCapableMobs.put(21454, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(GOLDEN_SPICE,Kookabura_1_Gold_2);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(GOLDEN_SPICE, Kookabura_1_Gold_2);
 		_GrowthCapableMobs.put(21453, temp);
 		_GrowthCapableMobs.put(21455, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(CRYSTAL_SPICE,Kookabura_1_Crystal_1);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(CRYSTAL_SPICE, Kookabura_1_Crystal_1);
 		_GrowthCapableMobs.put(21456, temp);
 		_GrowthCapableMobs.put(21458, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(CRYSTAL_SPICE,Kookabura_1_Crystal_2);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(CRYSTAL_SPICE, Kookabura_1_Crystal_2);
 		_GrowthCapableMobs.put(21457, temp);
 		_GrowthCapableMobs.put(21459, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(GOLDEN_SPICE,Kookabura_2_1);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(GOLDEN_SPICE, Kookabura_2_1);
 		_GrowthCapableMobs.put(21460, temp);
 		_GrowthCapableMobs.put(21462, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(GOLDEN_SPICE,Kookabura_2_2);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(GOLDEN_SPICE, Kookabura_2_2);
 		_GrowthCapableMobs.put(21461, temp);
 		_GrowthCapableMobs.put(21463, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(CRYSTAL_SPICE,Kookabura_2_1);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(CRYSTAL_SPICE, Kookabura_2_1);
 		_GrowthCapableMobs.put(21464, temp);
 		_GrowthCapableMobs.put(21466, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(CRYSTAL_SPICE,Kookabura_2_2);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(CRYSTAL_SPICE, Kookabura_2_2);
 		_GrowthCapableMobs.put(21465, temp);
 		_GrowthCapableMobs.put(21467, temp);
 		
 		// Alpen Buffalo
-		temp = new GrowthCapableMob(0,100);
-		temp.addMobs(GOLDEN_SPICE,Buffalo_0_Gold);
-		temp.addMobs(CRYSTAL_SPICE,Buffalo_0_Crystal);
+		temp = new GrowthCapableMob(0, 100);
+		temp.addMobs(GOLDEN_SPICE, Buffalo_0_Gold);
+		temp.addMobs(CRYSTAL_SPICE, Buffalo_0_Crystal);
 		_GrowthCapableMobs.put(21470, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(GOLDEN_SPICE,Buffalo_1_Gold_1);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(GOLDEN_SPICE, Buffalo_1_Gold_1);
 		_GrowthCapableMobs.put(21471, temp);
 		_GrowthCapableMobs.put(21473, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(GOLDEN_SPICE,Buffalo_1_Gold_2);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(GOLDEN_SPICE, Buffalo_1_Gold_2);
 		_GrowthCapableMobs.put(21472, temp);
 		_GrowthCapableMobs.put(21474, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(CRYSTAL_SPICE,Buffalo_1_Crystal_1);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(CRYSTAL_SPICE, Buffalo_1_Crystal_1);
 		_GrowthCapableMobs.put(21475, temp);
 		_GrowthCapableMobs.put(21477, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(CRYSTAL_SPICE,Buffalo_1_Crystal_2);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(CRYSTAL_SPICE, Buffalo_1_Crystal_2);
 		_GrowthCapableMobs.put(21476, temp);
 		_GrowthCapableMobs.put(21478, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(GOLDEN_SPICE,Buffalo_2_1);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(GOLDEN_SPICE, Buffalo_2_1);
 		_GrowthCapableMobs.put(21479, temp);
 		_GrowthCapableMobs.put(21481, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(GOLDEN_SPICE,Buffalo_2_2);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(GOLDEN_SPICE, Buffalo_2_2);
 		_GrowthCapableMobs.put(21480, temp);
 		_GrowthCapableMobs.put(21482, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(CRYSTAL_SPICE,Buffalo_2_1);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(CRYSTAL_SPICE, Buffalo_2_1);
 		_GrowthCapableMobs.put(21483, temp);
 		_GrowthCapableMobs.put(21485, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(CRYSTAL_SPICE,Buffalo_2_2);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(CRYSTAL_SPICE, Buffalo_2_2);
 		_GrowthCapableMobs.put(21484, temp);
 		_GrowthCapableMobs.put(21486, temp);
 		
 		// Alpen Cougar
-		temp = new GrowthCapableMob(0,100);
-		temp.addMobs(GOLDEN_SPICE,Cougar_0_Gold);
-		temp.addMobs(CRYSTAL_SPICE,Cougar_0_Crystal);
+		temp = new GrowthCapableMob(0, 100);
+		temp.addMobs(GOLDEN_SPICE, Cougar_0_Gold);
+		temp.addMobs(CRYSTAL_SPICE, Cougar_0_Crystal);
 		_GrowthCapableMobs.put(21489, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(GOLDEN_SPICE,Cougar_1_Gold_1);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(GOLDEN_SPICE, Cougar_1_Gold_1);
 		_GrowthCapableMobs.put(21490, temp);
 		_GrowthCapableMobs.put(21492, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(GOLDEN_SPICE,Cougar_1_Gold_2);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(GOLDEN_SPICE, Cougar_1_Gold_2);
 		_GrowthCapableMobs.put(21491, temp);
 		_GrowthCapableMobs.put(21493, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(CRYSTAL_SPICE,Cougar_1_Crystal_1);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(CRYSTAL_SPICE, Cougar_1_Crystal_1);
 		_GrowthCapableMobs.put(21494, temp);
 		_GrowthCapableMobs.put(21496, temp);
 		
-		temp = new GrowthCapableMob(1,40);
-		temp.addMobs(CRYSTAL_SPICE,Cougar_1_Crystal_2);
+		temp = new GrowthCapableMob(1, 40);
+		temp.addMobs(CRYSTAL_SPICE, Cougar_1_Crystal_2);
 		_GrowthCapableMobs.put(21495, temp);
 		_GrowthCapableMobs.put(21497, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(GOLDEN_SPICE,Cougar_2_1);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(GOLDEN_SPICE, Cougar_2_1);
 		_GrowthCapableMobs.put(21498, temp);
 		_GrowthCapableMobs.put(21500, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(GOLDEN_SPICE,Cougar_2_2);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(GOLDEN_SPICE, Cougar_2_2);
 		_GrowthCapableMobs.put(21499, temp);
 		_GrowthCapableMobs.put(21501, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(CRYSTAL_SPICE,Cougar_2_1);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(CRYSTAL_SPICE, Cougar_2_1);
 		_GrowthCapableMobs.put(21502, temp);
 		_GrowthCapableMobs.put(21504, temp);
 		
-		temp = new GrowthCapableMob(2,25);
-		temp.addMobs(CRYSTAL_SPICE,Cougar_2_2);
+		temp = new GrowthCapableMob(2, 25);
+		temp.addMobs(CRYSTAL_SPICE, Cougar_2_2);
 		_GrowthCapableMobs.put(21503, temp);
 		_GrowthCapableMobs.put(21505, temp);
 	}
 	
-	public void spawnNext(L2Npc npc, int growthLevel, L2PcInstance player, int food)
+	private void spawnNext(L2Npc npc, int growthLevel, L2PcInstance player, int food)
 	{
 		int npcId = npc.getNpcId();
 		int nextNpcId = 0;
@@ -371,23 +454,36 @@ public class FeedableBeasts extends L2AttackableAIScript
 		if (_FeedInfo.containsKey(npc.getObjectId()))
 		{
 			if (_FeedInfo.get(npc.getObjectId()) == player.getObjectId())
+			{
 				_FeedInfo.remove(npc.getObjectId());
+			}
 		}
 		// despawn the old mob
 		// TODO: same code? FIXED?
+		// @formatter:off
 		/*
-		 * if (_GrowthCapableMobs.get(npcId).getGrowthLevel() == 0) { npc.deleteMe(); } else {
+		 * if (_GrowthCapableMobs.get(npcId).getGrowthLevel() == 0)
+			{
+				npc.deleteMe();
+			}
+			else 
+			{
 		 */
 		npc.deleteMe();
 		// }
+		// @formatter:on
 		
 		// if this is finally a trained mob, then despawn any other trained mobs that the
 		// player might have and initialize the Tamed Beast.
 		if (Util.contains(TAMED_BEASTS, nextNpcId))
 		{
-			if (player.getTrainedBeasts() != null && !player.getTrainedBeasts().isEmpty())
+			if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty())
+			{
 				for (L2TamedBeastInstance oldTrained : player.getTrainedBeasts())
+				{
 					oldTrained.deleteMe();
+				}
+			}
 			
 			L2NpcTemplate template = NpcTable.getInstance().getTemplate(nextNpcId);
 			L2TamedBeastInstance nextNpc = new L2TamedBeastInstance(IdFactory.getInstance().getNextId(), template, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -398,7 +494,7 @@ public class FeedableBeasts extends L2AttackableAIScript
 			QuestState st = player.getQuestState(Q00020_BringUpWithLove.class.getSimpleName());
 			if (st != null)
 			{
-				if (getRandom(100) <= 5 && !st.hasQuestItems(7185))
+				if ((getRandom(100) <= 5) && !st.hasQuestItems(7185))
 				{
 					// if player has quest 20 going, give quest item
 					// it's easier to hardcode it in here than to try and repeat this stuff in the quest
@@ -451,7 +547,7 @@ public class FeedableBeasts extends L2AttackableAIScript
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
-		if (event.equalsIgnoreCase("polymorph Mad Cow") && npc != null && player != null)
+		if (event.equalsIgnoreCase("polymorph Mad Cow") && (npc != null) && (player != null))
 		{
 			if (MAD_COW_POLYMORPH.containsKey(npc.getNpcId()))
 			{
@@ -488,7 +584,7 @@ public class FeedableBeasts extends L2AttackableAIScript
 		int npcId = npc.getNpcId();
 		int skillId = skill.getId();
 		// check if the npc and skills used are valid for this script. Exit if invalid.
-		if (!Util.contains(FEEDABLE_BEASTS, npcId) || (skillId != SKILL_GOLDEN_SPICE && skillId != SKILL_CRYSTAL_SPICE))
+		if (!Util.contains(FEEDABLE_BEASTS, npcId) || ((skillId != SKILL_GOLDEN_SPICE) && (skillId != SKILL_CRYSTAL_SPICE)))
 		{
 			return super.onSkillSee(npc, caster, skill, targets, isPet);
 		}
@@ -503,7 +599,7 @@ public class FeedableBeasts extends L2AttackableAIScript
 		
 		// prevent exploit which allows 2 players to simultaneously raise the same 0-growth beast
 		// If the mob is at 0th level (when it still listens to all feeders) lock it to the first feeder!
-		if (growthLevel == 0 && _FeedInfo.containsKey(objectId))
+		if ((growthLevel == 0) && _FeedInfo.containsKey(objectId))
 		{
 			return super.onSkillSee(npc, caster, skill, targets, isPet);
 		}
@@ -538,7 +634,7 @@ public class FeedableBeasts extends L2AttackableAIScript
 				npc.broadcastPacket(new NpcSay(objectId, 0, npc.getNpcId(), TEXT[growthLevel][getRandom(TEXT[growthLevel].length)]));
 			}
 			
-			if (growthLevel > 0 && _FeedInfo.get(objectId) != caster.getObjectId())
+			if ((growthLevel > 0) && (_FeedInfo.get(objectId) != caster.getObjectId()))
 			{
 				// check if this is the same player as the one who raised it from growth 0.
 				// if no, then do not allow a chance to raise the pet (food gets consumed but has no effect).
@@ -548,10 +644,10 @@ public class FeedableBeasts extends L2AttackableAIScript
 			// Polymorph the mob, with a certain chance, given its current growth level
 			if (getRandom(100) < _GrowthCapableMobs.get(npcId).getChance())
 			{
-				this.spawnNext(npc, growthLevel, caster, food);
+				spawnNext(npc, growthLevel, caster, food);
 			}
 		}
-		else if (Util.contains(TAMED_BEASTS, npcId) && npc instanceof L2TamedBeastInstance)
+		else if (Util.contains(TAMED_BEASTS, npcId) && (npc instanceof L2TamedBeastInstance))
 		{
 			L2TamedBeastInstance beast = ((L2TamedBeastInstance) npc);
 			if (skillId == beast.getFoodType())
@@ -576,6 +672,6 @@ public class FeedableBeasts extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new FeedableBeasts(-1, FeedableBeasts.class.getSimpleName(), "ai");
+		new FeedableBeasts(FeedableBeasts.class.getSimpleName(), "ai");
 	}
 }

+ 18 - 10
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/GiantScouts.java

@@ -16,6 +16,8 @@ package ai.group_template;
 
 import java.util.Collection;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.L2Object;
@@ -32,14 +34,18 @@ import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
  * Giant Scouts AI.
  * @author Gnacik
  */
-public class GiantScouts extends L2AttackableAIScript
+public class GiantScouts extends AbstractNpcAI
 {
-	final private static int _scouts[] = { 22668, 22669 };
+	private static final int[] SCOUTS =
+	{
+		22668,
+		22669
+	};
 	
-	public GiantScouts(int questId, String name, String descr)
+	private GiantScouts(String name, String descr)
 	{
-		super(questId, name, descr);
-		registerMobs(_scouts, QuestEventType.ON_AGGRO_RANGE_ENTER);
+		super(name, descr);
+		registerMobs(SCOUTS, QuestEventType.ON_AGGRO_RANGE_ENTER);
 	}
 	
 	@Override
@@ -47,10 +53,12 @@ public class GiantScouts extends L2AttackableAIScript
 	{
 		L2Character target = isPet ? player.getPet() : player;
 		
-		if(GeoData.getInstance().canSeeTarget(npc, target))
+		if (GeoData.getInstance().canSeeTarget(npc, target))
 		{
-			if (!npc.isInCombat() && npc.getTarget() == null)
+			if (!npc.isInCombat() && (npc.getTarget() == null))
+			{
 				npc.broadcastPacket(new CreatureSay(npc.getObjectId(), Say2.SHOUT, npc.getName(), NpcStringId.OH_GIANTS_AN_INTRUDER_HAS_BEEN_DISCOVERED));
+			}
 			
 			npc.setTarget(target);
 			npc.setRunning();
@@ -59,14 +67,14 @@ public class GiantScouts extends L2AttackableAIScript
 			
 			// Notify clan
 			Collection<L2Object> objs = npc.getKnownList().getKnownObjects().values();
-			for(L2Object obj : objs)
+			for (L2Object obj : objs)
 			{
 				if (obj != null)
 				{
 					if (obj instanceof L2MonsterInstance)
 					{
 						L2MonsterInstance monster = (L2MonsterInstance) obj;
-						if (( npc.getClan() != null && monster.getClan() != null) && monster.getClan().equals(npc.getClan()) && GeoData.getInstance().canSeeTarget(npc, monster))
+						if (((npc.getClan() != null) && (monster.getClan() != null)) && monster.getClan().equals(npc.getClan()) && GeoData.getInstance().canSeeTarget(npc, monster))
 						{
 							monster.setTarget(target);
 							monster.setRunning();
@@ -83,6 +91,6 @@ public class GiantScouts extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new GiantScouts(-1, GiantScouts.class.getSimpleName(), "ai");
+		new GiantScouts(GiantScouts.class.getSimpleName(), "ai");
 	}
 }

+ 39 - 81
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/L2AttackableAIScript.java

@@ -16,7 +16,6 @@ package ai.group_template;
 
 import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK;
 
-import java.util.Collection;
 import java.util.List;
 
 import com.l2jserver.Config;
@@ -41,64 +40,15 @@ import com.l2jserver.gameserver.util.Util;
  * Overarching Superclass for all mob AI.
  * @author Fulminus
  */
-public class L2AttackableAIScript extends QuestJython
+public final class L2AttackableAIScript extends QuestJython
 {
-	/**
-	 * This is used to register all monsters contained in mobs for a particular script<BR>
-	 * <FONT COLOR=#FF0000><B> <U>Caution</U> : This method register ID for all QuestEventTypes<BR>
-	 * Do not use for group_template AIs</B></FONT><BR>
-	 * @param mobs
-	 * @see #registerMobs(int[], QuestEventType...)
-	 */
-	public void registerMobs(int[] mobs)
-	{
-		for (int id : mobs)
-		{
-			addEventId(id, QuestEventType.ON_ATTACK);
-			addEventId(id, QuestEventType.ON_KILL);
-			addEventId(id, QuestEventType.ON_SPAWN);
-			addEventId(id, QuestEventType.ON_SPELL_FINISHED);
-			addEventId(id, QuestEventType.ON_SKILL_SEE);
-			addEventId(id, QuestEventType.ON_FACTION_CALL);
-			addEventId(id, QuestEventType.ON_AGGRO_RANGE_ENTER);
-		}
-	}
-	
-	/**
-	 * This is used to register all monsters contained in mobs for a particular script
-	 * event types defined in types.
-	 * @param mobs
-	 * @param types
-	 */
-	public void registerMobs(int[] mobs, QuestEventType... types)
-	{
-		for (int id : mobs)
-		{
-			for (QuestEventType type : types)
-			{
-				addEventId(id, type);
-			}
-		}
-	}
-	
-	public void registerMobs(Collection<Integer> mobs, QuestEventType... types)
-	{
-		for (int id : mobs)
-		{
-			for (QuestEventType type : types)
-			{
-				addEventId(id, type);
-			}
-		}
-	}
-	
-	public L2AttackableAIScript (int questId, String name, String descr)
+	private L2AttackableAIScript(int questId, String name, String descr)
 	{
 		super(questId, name, descr);
 	}
 	
 	@Override
-	public String onAdvEvent (String event, L2Npc npc, L2PcInstance player)
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
 		return null;
 	}
@@ -110,7 +60,7 @@ public class L2AttackableAIScript extends QuestJython
 	}
 	
 	@Override
-	public String onSkillSee (L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
+	public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
 	{
 		if (caster == null)
 		{
@@ -121,27 +71,29 @@ public class L2AttackableAIScript extends QuestJython
 			return null;
 		}
 		
-		L2Attackable attackable = (L2Attackable)npc;
+		L2Attackable attackable = (L2Attackable) npc;
 		
 		int skillAggroPoints = skill.getAggroPoints();
 		
 		if (caster.getPet() != null)
 		{
-			if (targets.length == 1 && Util.contains(targets, caster.getPet()))
+			if ((targets.length == 1) && Util.contains(targets, caster.getPet()))
+			{
 				skillAggroPoints = 0;
+			}
 		}
 		
 		if (skillAggroPoints > 0)
 		{
-			if ( attackable.hasAI() && (attackable.getAI().getIntention() == AI_INTENTION_ATTACK))
+			if (attackable.hasAI() && (attackable.getAI().getIntention() == AI_INTENTION_ATTACK))
 			{
 				L2Object npcTarget = attackable.getTarget();
 				for (L2Object skillTarget : targets)
 				{
-					if (npcTarget == skillTarget || npc == skillTarget)
+					if ((npcTarget == skillTarget) || (npc == skillTarget))
 					{
-						L2Character originalCaster = isPet? caster.getPet(): caster;
-						attackable.addDamageHate(originalCaster, 0, (skillAggroPoints*150)/(attackable.getLevel()+7));
+						L2Character originalCaster = isPet ? caster.getPet() : caster;
+						attackable.addDamageHate(originalCaster, 0, (skillAggroPoints * 150) / (attackable.getLevel() + 7));
 					}
 				}
 			}
@@ -151,20 +103,20 @@ public class L2AttackableAIScript extends QuestJython
 	}
 	
 	@Override
-	public String onFactionCall (L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isPet)
+	public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isPet)
 	{
-		if(attacker == null)
+		if (attacker == null)
+		{
 			return null;
+		}
 		
-		L2Character originalAttackTarget = (isPet? attacker.getPet(): attacker);
-		if ( attacker.isInParty()
-				&& attacker.getParty().isInDimensionalRift())
+		L2Character originalAttackTarget = (isPet ? attacker.getPet() : attacker);
+		if (attacker.isInParty() && attacker.getParty().isInDimensionalRift())
 		{
 			byte riftType = attacker.getParty().getDimensionalRift().getType();
 			byte riftRoom = attacker.getParty().getDimensionalRift().getCurrentRoom();
 			
-			if (caller instanceof L2RiftInvaderInstance
-					&& !DimensionalRiftManager.getInstance().getRoom(riftType, riftRoom).checkIfInZone(npc.getX(), npc.getY(), npc.getZ()))
+			if ((caller instanceof L2RiftInvaderInstance) && !DimensionalRiftManager.getInstance().getRoom(riftType, riftRoom).checkIfInZone(npc.getX(), npc.getY(), npc.getZ()))
 			{
 				return null;
 			}
@@ -178,10 +130,12 @@ public class L2AttackableAIScript extends QuestJython
 	}
 	
 	@Override
-	public String onAggroRangeEnter (L2Npc npc, L2PcInstance player, boolean isPet)
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
 	{
 		if (player == null)
+		{
 			return null;
+		}
 		
 		L2Character target = isPet ? player.getPet() : player;
 		
@@ -189,60 +143,64 @@ public class L2AttackableAIScript extends QuestJython
 		
 		// Set the intention to the L2Attackable to AI_INTENTION_ACTIVE
 		if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE)
+		{
 			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+		}
 		return null;
 	}
 	
 	@Override
-	public String onSpawn (L2Npc npc)
+	public String onSpawn(L2Npc npc)
 	{
 		return null;
 	}
 	
 	@Override
-	public String onAttack (L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
 	{
 		if ((attacker != null) && (npc instanceof L2Attackable))
 		{
-			L2Attackable attackable = (L2Attackable)npc;
+			L2Attackable attackable = (L2Attackable) npc;
 			
-			L2Character originalAttacker = isPet? attacker.getPet(): attacker;
+			L2Character originalAttacker = isPet ? attacker.getPet() : attacker;
 			attackable.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, originalAttacker);
-			attackable.addDamageHate(originalAttacker, damage, (damage*100)/(attackable.getLevel()+7));
+			attackable.addDamageHate(originalAttacker, damage, (damage * 100) / (attackable.getLevel() + 7));
 		}
 		return null;
 	}
 	
 	@Override
-	public String onKill (L2Npc npc, L2PcInstance killer, boolean isPet)
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
 		if (npc instanceof L2MonsterInstance)
 		{
-			final L2MonsterInstance mob = (L2MonsterInstance)npc;
+			final L2MonsterInstance mob = (L2MonsterInstance) npc;
 			if (mob.getLeader() != null)
 			{
 				final int respawnTime = Config.MINIONS_RESPAWN_TIME.containsKey(npc.getNpcId()) ? Config.MINIONS_RESPAWN_TIME.get(mob.getNpcId()) * 1000 : -1;
 				mob.getLeader().getMinionList().onMinionDie(mob, respawnTime);
 			}
-
+			
 			if (mob.hasMinions())
+			{
 				mob.getMinionList().onMasterDie(false);
+			}
 		}
 		return null;
 	}
 	
 	public static void main(String[] args)
 	{
-		L2AttackableAIScript ai = new L2AttackableAIScript(-1,"L2AttackableAIScript","L2AttackableAIScript");
+		L2AttackableAIScript ai = new L2AttackableAIScript(-1, L2AttackableAIScript.class.getSimpleName(), "ai");
 		// register all mobs here...
-		for (int level =1; level<100; level++)
+		for (int level = 1; level < 100; level++)
 		{
 			final List<L2NpcTemplate> templates = NpcTable.getInstance().getAllOfLevel(level);
 			for (L2NpcTemplate t : templates)
 			{
 				try
 				{
-					if (L2Attackable.class.isAssignableFrom(Class.forName("com.l2jserver.gameserver.model.actor.instance."+t.getType()+"Instance")))
+					if (L2Attackable.class.isAssignableFrom(Class.forName("com.l2jserver.gameserver.model.actor.instance." + t.getType() + "Instance")))
 					{
 						ai.addEventId(t.getNpcId(), Quest.QuestEventType.ON_ATTACK);
 						ai.addEventId(t.getNpcId(), Quest.QuestEventType.ON_KILL);
@@ -252,9 +210,9 @@ public class L2AttackableAIScript extends QuestJython
 						ai.addEventId(t.getNpcId(), Quest.QuestEventType.ON_AGGRO_RANGE_ENTER);
 					}
 				}
-				catch(ClassNotFoundException ex)
+				catch (ClassNotFoundException ex)
 				{
-					_log.info("Class not found "+t.getType()+"Instance");
+					_log.info("Class not found " + t.getType() + "Instance");
 				}
 			}
 		}

+ 17 - 16
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Monastery.java

@@ -17,6 +17,7 @@ package ai.group_template;
 import java.util.Collection;
 
 import javolution.util.FastList;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SkillTable;
@@ -39,9 +40,9 @@ import com.l2jserver.gameserver.util.Util;
  * Monastery AI.
  * @author Kerberos
  */
-public class Monastery extends L2AttackableAIScript
+public class Monastery extends AbstractNpcAI
 {
-	private static final int[] mobs1 =
+	private static final int[] MOBS1 =
 	{
 		22124,
 		22125,
@@ -49,35 +50,35 @@ public class Monastery extends L2AttackableAIScript
 		22127,
 		22129
 	};
-	private static final int[] mobs2 =
+	private static final int[] MOBS2 =
 	{
 		22134,
 		22135
 	};
 	
-	private static final NpcStringId[] messages =
+	private static final NpcStringId[] MESSAGES =
 	{
 		NpcStringId.YOU_CANNOT_CARRY_A_WEAPON_WITHOUT_AUTHORIZATION,
 		NpcStringId.S1_WHY_WOULD_YOU_CHOOSE_THE_PATH_OF_DARKNESS,
 		NpcStringId.S1_HOW_DARE_YOU_DEFY_THE_WILL_OF_EINHASAD
 	};
 	
-	public Monastery(int questId, String name, String descr)
+	private Monastery(String name, String descr)
 	{
-		super(questId, name, descr);
-		registerMobs(mobs1, QuestEventType.ON_AGGRO_RANGE_ENTER, QuestEventType.ON_SPAWN, QuestEventType.ON_SPELL_FINISHED);
-		registerMobs(mobs2, QuestEventType.ON_SKILL_SEE);
+		super(name, descr);
+		registerMobs(MOBS1, QuestEventType.ON_AGGRO_RANGE_ENTER, QuestEventType.ON_SPAWN, QuestEventType.ON_SPELL_FINISHED);
+		registerMobs(MOBS2, QuestEventType.ON_SKILL_SEE);
 	}
 	
 	@Override
 	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
 	{
-		if (Util.contains(mobs1, npc.getNpcId()) && !npc.isInCombat() && (npc.getTarget() == null))
+		if (Util.contains(MOBS1, npc.getNpcId()) && !npc.isInCombat() && (npc.getTarget() == null))
 		{
 			if (player.getActiveWeaponInstance() != null)
 			{
 				npc.setTarget(player);
-				npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), messages[0]));
+				npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), MESSAGES[0]));
 				switch (npc.getNpcId())
 				{
 					case 22124:
@@ -107,7 +108,7 @@ public class Monastery extends L2AttackableAIScript
 	@Override
 	public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
 	{
-		if (Util.contains(mobs2, npc.getNpcId()))
+		if (Util.contains(MOBS2, npc.getNpcId()))
 		{
 			if ((skill.getSkillType() == L2SkillType.AGGDAMAGE) && (targets.length != 0))
 			{
@@ -115,7 +116,7 @@ public class Monastery extends L2AttackableAIScript
 				{
 					if (obj.equals(npc))
 					{
-						NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), messages[getRandom(2) + 1]);
+						NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), MESSAGES[getRandom(2) + 1]);
 						packet.addStringParameter(caster.getName());
 						npc.broadcastPacket(packet);
 						((L2Attackable) npc).addDamageHate(caster, 0, 999);
@@ -131,7 +132,7 @@ public class Monastery extends L2AttackableAIScript
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (Util.contains(mobs1, npc.getNpcId()))
+		if (Util.contains(MOBS1, npc.getNpcId()))
 		{
 			FastList<L2Playable> result = new FastList<>();
 			Collection<L2Object> objs = npc.getKnownList().getKnownObjects().values();
@@ -154,7 +155,7 @@ public class Monastery extends L2AttackableAIScript
 					if ((target.getActiveWeaponInstance() != null) && !npc.isInCombat() && (npc.getTarget() == null))
 					{
 						npc.setTarget(target);
-						npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), messages[0]));
+						npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), MESSAGES[0]));
 						switch (npc.getNpcId())
 						{
 							case 22124:
@@ -183,7 +184,7 @@ public class Monastery extends L2AttackableAIScript
 	@Override
 	public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill)
 	{
-		if (Util.contains(mobs1, npc.getNpcId()) && (skill.getId() == 4589))
+		if (Util.contains(MOBS1, npc.getNpcId()) && (skill.getId() == 4589))
 		{
 			npc.setIsRunning(true);
 			((L2Attackable) npc).addDamageHate(player, 0, 999);
@@ -194,6 +195,6 @@ public class Monastery extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new Monastery(-1, Monastery.class.getSimpleName(), "ai");
+		new Monastery(Monastery.class.getSimpleName(), "ai");
 	}
 }

+ 28 - 30
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PavelArchaic.java

@@ -14,35 +14,50 @@
  */
 package ai.group_template;
 
-import com.l2jserver.gameserver.ai.CtrlIntention;
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.util.Util;
 
 /**
  * Pavel Archaic AI.
  * @author Gnacik
  */
-public class PavelArchaic extends L2AttackableAIScript
+public class PavelArchaic extends AbstractNpcAI
 {
-	private static final int[] _mobs1 = { 22801, 22804 };
-	private static final int[] _mobs2 = { 18917 };
+	private static final int[] MOBS1 =
+	{
+		22801,
+		22804
+	};
+	
+	private static final int[] MOBS2 =
+	{
+		18917
+	};
+	
+	private PavelArchaic(String name, String descr)
+	{
+		super(name, descr);
+		registerMobs(MOBS1, QuestEventType.ON_KILL);
+		registerMobs(MOBS2, QuestEventType.ON_ATTACK);
+	}
 	
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
 	{
-		if (!npc.isDead() && Util.contains(_mobs2, npc.getNpcId()))
+		if (!npc.isDead())
 		{
 			npc.doDie(attacker);
 			
 			if (getRandom(100) < 40)
 			{
-				L2Attackable _golem1 = (L2Attackable) addSpawn(22801, npc.getLocation(), false, 0);
-				attackPlayer(_golem1, attacker);
+				L2Attackable golem1 = (L2Attackable) addSpawn(22801, npc.getLocation(), false, 0);
+				attackPlayer(golem1, attacker);
 				
-				L2Attackable _golem2 = (L2Attackable) addSpawn(22804, npc.getLocation(), false, 0);
-				attackPlayer(_golem2, attacker);
+				L2Attackable golem2 = (L2Attackable) addSpawn(22804, npc.getLocation(), false, 0);
+				attackPlayer(golem2, attacker);
 			}
 		}
 		return super.onAttack(npc, attacker, damage, isPet);
@@ -51,30 +66,13 @@ public class PavelArchaic extends L2AttackableAIScript
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
-		if (Util.contains(_mobs1, npc.getNpcId()))
-		{
-			L2Attackable _golem = (L2Attackable) addSpawn(npc.getNpcId() + 1, npc.getLocation(), false, 0);
-			attackPlayer(_golem, killer);
-		}
+		L2Attackable _golem = (L2Attackable) addSpawn(npc.getNpcId() + 1, npc.getLocation(), false, 0);
+		attackPlayer(_golem, killer);
 		return super.onKill(npc, killer, isPet);
 	}
 	
-	private void attackPlayer(L2Attackable npc, L2PcInstance player)
-	{
-		npc.setIsRunning(true);
-		npc.addDamageHate(player, 0, 999);
-		npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
-	}
-	
-	public PavelArchaic(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		registerMobs(_mobs1, QuestEventType.ON_KILL);
-		registerMobs(_mobs2, QuestEventType.ON_ATTACK);
-	}
-	
 	public static void main(String[] args)
 	{
-		new PavelArchaic(-1, PavelArchaic.class.getSimpleName(), "ai");
+		new PavelArchaic(PavelArchaic.class.getSimpleName(), "ai");
 	}
 }

+ 49 - 27
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PlainsOfLizardman.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.handler.ISkillHandler;
@@ -31,9 +33,15 @@ import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
  * Plains Of Lizardman AI.
  * @author Gnacik
  */
-public class PlainsOfLizardman extends L2AttackableAIScript
+public class PlainsOfLizardman extends AbstractNpcAI
 {
-	private static final int[] _MOBS = { 18864, 18865, 18866, 18868 };
+	private static final int[] _MOBS =
+	{
+		18864,
+		18865,
+		18866,
+		18868
+	};
 	
 	private static final int FANTASY_MUSHROOM = 18864;
 	private static final int FANTASY_MUSHROOM_SKILL = 6427;
@@ -47,26 +55,22 @@ public class PlainsOfLizardman extends L2AttackableAIScript
 	private static final int ENERGY_PLANT = 18868;
 	private static final int ENERGY_PLANT_SKILL = 6430;
 	
-	public PlainsOfLizardman(int questId, String name, String descr)
+	private PlainsOfLizardman(String name, String descr)
 	{
-		super(questId, name, descr);
-		
+		super(name, descr);
 		registerMobs(_MOBS, QuestEventType.ON_ATTACK);
 	}
 	
-	public static void main(String[] args)
-	{
-		new PlainsOfLizardman(-1, PlainsOfLizardman.class.getSimpleName(), "ai");
-	}
-	
 	@Override
-	public String onAdvEvent (String event, L2Npc npc, L2PcInstance player)
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
-		if (player != null && !player.isAlikeDead())
+		if ((player != null) && !player.isAlikeDead())
 		{
 			boolean isPet = false;
-			if (event.endsWith("_pet") && player.getPet() != null && !player.getPet().isDead())
+			if (event.endsWith("_pet") && (player.getPet() != null) && !player.getPet().isDead())
+			{
 				isPet = true;
+			}
 			
 			if (event.startsWith("rainbow_frog"))
 			{
@@ -84,9 +88,9 @@ public class PlainsOfLizardman extends L2AttackableAIScript
 			{
 				L2Skill skill = SkillTable.getInstance().getInfo(FANTASY_MUSHROOM_SKILL, 1);
 				npc.doCast(skill);
-				for(L2Character target : npc.getKnownList().getKnownCharactersInRadius(200))
+				for (L2Character target : npc.getKnownList().getKnownCharactersInRadius(200))
 				{
-					if (target != null && target instanceof L2Attackable && target.getAI() != null)
+					if ((target != null) && (target instanceof L2Attackable) && (target.getAI() != null))
 					{
 						skill.getEffects(npc, target);
 						attackPlayer((L2Attackable) target, isPet ? player.getPet() : player);
@@ -95,82 +99,100 @@ public class PlainsOfLizardman extends L2AttackableAIScript
 				npc.doDie(player);
 			}
 		}
-		return super.onAdvEvent(event,npc,player);
+		return super.onAdvEvent(event, npc, player);
 	}
 	
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
 	{
 		if (npc.isDead())
+		{
 			return null;
+		}
 		
 		if (npc.getNpcId() == RAINBOW_FROG)
 		{
 			if (isPet)
+			{
 				startQuestTimer("rainbow_frog_pet", 2000, npc, attacker);
+			}
 			else
+			{
 				startQuestTimer("rainbow_frog", 2000, npc, attacker);
+			}
 			npc.doDie(attacker);
 		}
 		else if (npc.getNpcId() == STICKY_MUSHROOM)
 		{
 			if (isPet)
+			{
 				startQuestTimer("sticky_mushroom_pet", 2000, npc, attacker);
+			}
 			else
+			{
 				startQuestTimer("sticky_mushroom", 2000, npc, attacker);
+			}
 			npc.doDie(attacker);
 		}
 		else if (npc.getNpcId() == ENERGY_PLANT)
 		{
 			if (isPet)
+			{
 				startQuestTimer("energy_plant_pet", 2000, npc, attacker);
+			}
 			else
+			{
 				startQuestTimer("energy_plant", 2000, npc, attacker);
+			}
 			npc.doDie(attacker);
 		}
 		else if (npc.getNpcId() == FANTASY_MUSHROOM)
 		{
-			for(L2Character target : npc.getKnownList().getKnownCharactersInRadius(1000))
+			for (L2Character target : npc.getKnownList().getKnownCharactersInRadius(1000))
 			{
-				if (target != null && target instanceof L2Attackable && target.getAI() != null)
+				if ((target != null) && (target instanceof L2Attackable) && (target.getAI() != null))
 				{
 					target.setIsRunning(true);
-					target.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(npc.getX(),npc.getY(), npc.getZ(), 0 ));
+					target.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(npc.getX(), npc.getY(), npc.getZ(), 0));
 				}
 			}
 			if (isPet)
+			{
 				startQuestTimer("fantasy_mushroom_pet", 3000, npc, attacker);
+			}
 			else
+			{
 				startQuestTimer("fantasy_mushroom", 3000, npc, attacker);
+			}
 		}
 		return super.onAttack(npc, attacker, damage, isPet);
 	}
 	
-	private void triggerSkill(L2Character caster, L2Playable playable, int skill_id, int skill_level)
+	private static void triggerSkill(L2Character caster, L2Playable playable, int skill_id, int skill_level)
 	{
 		L2Character[] targets = new L2Character[1];
 		targets[0] = playable;
 		
 		L2Skill trigger = SkillTable.getInstance().getInfo(skill_id, skill_level);
 		
-		if (trigger != null
-				&& playable.isInsideRadius(caster, trigger.getCastRange(), true, false)
-				&& playable.getInstanceId() == caster.getInstanceId())
+		if ((trigger != null) && playable.isInsideRadius(caster, trigger.getCastRange(), true, false) && (playable.getInstanceId() == caster.getInstanceId()))
 		{
 			playable.broadcastPacket(new MagicSkillUse(playable, playable, skill_id, skill_level, 0, 0));
 			
 			ISkillHandler handler = SkillHandler.getInstance().getHandler(trigger.getSkillType());
 			if (handler != null)
+			{
 				handler.useSkill(playable, trigger, targets);
+			}
 			else
+			{
 				trigger.useSkill(playable, targets);
+			}
 		}
 	}
 	
-	private void attackPlayer(L2Attackable npc, L2Playable playable)
+	public static void main(String[] args)
 	{
-		npc.setIsRunning(true);
-		npc.addDamageHate(playable, 0, 999);
-		npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, playable);
+		new PlainsOfLizardman(PlainsOfLizardman.class.getSimpleName(), "ai");
 	}
 }

+ 8 - 15
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PolymorphingAngel.java

@@ -17,6 +17,7 @@ package ai.group_template;
 import java.util.Map;
 
 import javolution.util.FastMap;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -25,7 +26,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 L2AttackableAIScript
+public class PolymorphingAngel extends AbstractNpcAI
 {
 	private static final Map<Integer, Integer> ANGELSPAWNS = new FastMap<>();
 	static
@@ -37,30 +38,22 @@ public class PolymorphingAngel extends L2AttackableAIScript
 		ANGELSPAWNS.put(21070, 21071);
 	}
 	
-	public PolymorphingAngel(int questId, String name, String descr)
+	private PolymorphingAngel(String name, String descr)
 	{
-		super(questId, name, descr);
-		int[] temp =
-		{
-			20830, 21067, 21062, 20831, 21070
-		};
-		registerMobs(temp, QuestEventType.ON_KILL);
+		super(name, descr);
+		addKillId(ANGELSPAWNS.keySet());
 	}
 	
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
-		int npcId = npc.getNpcId();
-		if (ANGELSPAWNS.containsKey(npcId))
-		{
-			L2Attackable newNpc = (L2Attackable) addSpawn(ANGELSPAWNS.get(npcId), npc);
-			newNpc.setRunning();
-		}
+		L2Attackable newNpc = (L2Attackable) addSpawn(ANGELSPAWNS.get(npc.getNpcId()), npc);
+		newNpc.setRunning();
 		return super.onKill(npc, killer, isPet);
 	}
 	
 	public static void main(String[] args)
 	{
-		new PolymorphingAngel(-1, PolymorphingAngel.class.getSimpleName(), "ai");
+		new PolymorphingAngel(PolymorphingAngel.class.getSimpleName(), "ai");
 	}
 }

+ 7 - 5
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java

@@ -19,6 +19,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
@@ -32,10 +34,9 @@ import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
  * Polymorphing on attack monsters AI.
  * @author Slyce
  */
-public class PolymorphingOnAttack extends L2AttackableAIScript
+public class PolymorphingOnAttack extends AbstractNpcAI
 {
 	private static final Map<Integer, List<Integer>> MOBSPAWNS = new HashMap<>();
-	
 	static
 	{
 		MOBSPAWNS.put(21258, Arrays.asList(21259, 100, 100, -1)); // Fallen Orc Shaman -> Sharp Talon Tiger (always polymorphs)
@@ -52,6 +53,7 @@ public class PolymorphingOnAttack extends L2AttackableAIScript
 		MOBSPAWNS.put(21533, Arrays.asList(21534, 100, 30, -1)); // Alliance of Splendor
 		MOBSPAWNS.put(21537, Arrays.asList(21538, 100, 30, -1)); // Fang of Splendor
 	}
+	
 	protected static final NpcStringId[][] MOBTEXTS =
 	{
 		new NpcStringId[]
@@ -74,9 +76,9 @@ public class PolymorphingOnAttack extends L2AttackableAIScript
 		}
 	};
 	
-	public PolymorphingOnAttack(int questId, String name, String descr)
+	private PolymorphingOnAttack(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		registerMobs(MOBSPAWNS.keySet(), QuestEventType.ON_ATTACK);
 	}
 	
@@ -110,6 +112,6 @@ public class PolymorphingOnAttack extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new PolymorphingOnAttack(-1, PolymorphingOnAttack.class.getSimpleName(), "ai");
+		new PolymorphingOnAttack(PolymorphingOnAttack.class.getSimpleName(), "ai");
 	}
 }

+ 9 - 6
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java

@@ -17,6 +17,7 @@ package ai.group_template;
 import java.util.Map;
 
 import javolution.util.FastMap;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SkillTable;
@@ -31,15 +32,18 @@ import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
 import com.l2jserver.gameserver.network.serverpackets.NpcSay;
 
+import custom.IOPRace.IOPRace;
+
 /**
  * Prison Guards AI.
  * @author Gigiikun
  */
-public class PrisonGuards extends L2AttackableAIScript
+public class PrisonGuards extends AbstractNpcAI
 {
 	final private static int GUARD1 = 18367;
 	final private static int GUARD2 = 18368;
 	final private static int STAMP = 10013;
+	
 	final private static String[] GUARDVARS =
 	{
 		"1st",
@@ -47,7 +51,6 @@ public class PrisonGuards extends L2AttackableAIScript
 		"3rd",
 		"4th"
 	};
-	final private static String qn = "IOPRace";
 	
 	private final static int silence = 4098;
 	private final static int pertification = 4578;
@@ -57,9 +60,9 @@ public class PrisonGuards extends L2AttackableAIScript
 	
 	private final Map<L2Npc, Integer> _guards = new FastMap<>();
 	
-	public PrisonGuards(int questId, String name, String descr)
+	private PrisonGuards(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		int[] mob =
 		{
 			GUARD1,
@@ -216,7 +219,7 @@ public class PrisonGuards extends L2AttackableAIScript
 		}
 		else if ((npc.getNpcId() == GUARD1) && (getRandom(100) < 5))
 		{
-			final QuestState qs = player.getQuestState(qn);
+			final QuestState qs = player.getQuestState(IOPRace.class.getSimpleName());
 			if ((qs != null) && (qs.getInt(GUARDVARS[_guards.get(npc)]) != 1))
 			{
 				qs.set(GUARDVARS[_guards.get(npc)], "1");
@@ -256,6 +259,6 @@ public class PrisonGuards extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new PrisonGuards(-1, PrisonGuards.class.getSimpleName(), "ai");
+		new PrisonGuards(PrisonGuards.class.getSimpleName(), "ai");
 	}
 }

+ 28 - 25
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/RandomSpawn.java

@@ -17,6 +17,7 @@ package ai.group_template;
 import java.util.Map;
 
 import javolution.util.FastMap;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.model.Location;
@@ -26,7 +27,7 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
  * Manages spawn of NPC's, having several random spawn points.
  * @author GKR
  */
-public class RandomSpawn extends L2AttackableAIScript
+public class RandomSpawn extends AbstractNpcAI
 {
 	private static Map<Integer, Location[]> SPAWN_POINTS = new FastMap<>();
 	
@@ -34,33 +35,33 @@ public class RandomSpawn extends L2AttackableAIScript
 	{
 		// Keltas
 		SPAWN_POINTS.put(22341, new Location[]
-		{	
+		{
 			new Location(-27136, 250938, -3523),
 			new Location(-29658, 252897, -3523),
-			new Location(-27237, 251943, -3527), 
+			new Location(-27237, 251943, -3527),
 			new Location(-28868, 250113, -3479)
 		});
 		// Keymaster
 		SPAWN_POINTS.put(22361, new Location[]
-		{	
-			new Location(14091, 250533, -1940),	
-			new Location(15762, 252440, -2015),	
-			new Location(19836, 256212, -2090),	
-			new Location(21940, 254107, -2010),	
+		{
+			new Location(14091, 250533, -1940),
+			new Location(15762, 252440, -2015),
+			new Location(19836, 256212, -2090),
+			new Location(21940, 254107, -2010),
 			new Location(17299, 252943, -2015),
 		});
 		// Typhoon
 		SPAWN_POINTS.put(25539, new Location[]
-		{	
-			new Location(-20641, 255370, -3235), 
+		{
+			new Location(-20641, 255370, -3235),
 			new Location(-16157, 250993, -3058),
-			new Location(-18269, 250721, -3151), 
+			new Location(-18269, 250721, -3151),
 			new Location(-16532, 254864, -3223),
-			new Location(-19055, 253489, -3440), 
-			new Location(-9684, 254256, -3148), 
-			new Location(-6209, 251924, -3189),	
+			new Location(-19055, 253489, -3440),
+			new Location(-9684, 254256, -3148),
+			new Location(-6209, 251924, -3189),
 			new Location(-10547, 251359, -2929),
-			new Location(-7254, 254997, -3261), 
+			new Location(-7254, 254997, -3261),
 			new Location(-4883, 253171, -3322)
 		});
 		// Mutated Elpy
@@ -69,20 +70,22 @@ public class RandomSpawn extends L2AttackableAIScript
 			new Location(-46080, 246368, -14183),
 			new Location(-44816, 246368, -14183),
 			new Location(-44224, 247440, -14184),
-			new Location(-44896, 248464, -14183), 
+			new Location(-44896, 248464, -14183),
 			new Location(-46064, 248544, -14183),
 			new Location(-46720, 247424, -14183)
 		});
 	}
 	
-	public RandomSpawn(int questId, String name, String descr)
+	public RandomSpawn(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		
 		for (int npcId : SPAWN_POINTS.keySet())
-			addSpawnId(npcId); 
+		{
+			addSpawnId(npcId);
+		}
 	}
-
+	
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
@@ -100,27 +103,27 @@ public class RandomSpawn extends L2AttackableAIScript
 		
 		return super.onSpawn(npc);
 	}
-
+	
 	private static class Teleport implements Runnable
 	{
 		private final L2Npc _npc;
 		private final Location _loc;
-
+		
 		public Teleport(L2Npc npc, Location loc)
 		{
 			_npc = npc;
 			_loc = loc;
 		}
-
+		
 		@Override
 		public void run()
 		{
 			_npc.teleToLocation(_loc, false);
 		}
 	}
-
+	
 	public static void main(String[] args)
 	{
-		new RandomSpawn(-1, RandomSpawn.class.getSimpleName(), "ai");
+		new RandomSpawn(RandomSpawn.class.getSimpleName(), "ai");
 	}
 }

+ 19 - 15
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Remnants.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -23,11 +25,13 @@ import com.l2jserver.gameserver.model.skills.L2Skill;
  * Remnants AI.
  * @author DS
  */
-public class Remnants extends L2AttackableAIScript
+public class Remnants extends AbstractNpcAI
 {
 	private static final int[] NPCS =
 	{
-		18463, 18464, 18465
+		18463,
+		18464,
+		18465
 	};
 	
 	private static final int HOLY_WATER = 2358;
@@ -36,6 +40,18 @@ public class Remnants extends L2AttackableAIScript
 	// private static final String MSG = "The holy water affects Remnants Ghost. You have freed his soul.";
 	// private static final String MSG_DEREK = "The holy water affects Derek. You have freed his soul.";
 	
+	/**
+	 * Do not override onKill for Derek here. Let's make global Hellbound manipulations in Engine where it is possible.
+	 * @param name
+	 * @param descr
+	 */
+	private Remnants(String name, String descr)
+	{
+		super(name, descr);
+		addSpawnId(NPCS);
+		addSkillSeeId(NPCS);
+	}
+	
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
@@ -73,20 +89,8 @@ public class Remnants extends L2AttackableAIScript
 		return super.onSkillSee(npc, caster, skill, targets, isPet);
 	}
 	
-	// Do not override onKill for Derek here. Let's make global Hellbound manipulations in Engine where it is possible.
-	
-	public Remnants(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		for (int npcId : NPCS)
-		{
-			addSpawnId(npcId);
-			addSkillSeeId(npcId);
-		}
-	}
-	
 	public static void main(String[] args)
 	{
-		new Remnants(-1, Remnants.class.getSimpleName(), "ai");
+		new Remnants(Remnants.class.getSimpleName(), "ai");
 	}
 }

+ 9 - 10
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Sandstorms.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -22,29 +24,26 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * Sandstorms AI.
  * @author Ectis
  */
-public class Sandstorms extends L2AttackableAIScript
+public class Sandstorms extends AbstractNpcAI
 {
 	private static final int SANDSTORM = 32350;
 	
 	@Override
 	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
 	{
-		if (npc.getNpcId() == SANDSTORM)
-		{
-			npc.setTarget(player);
-			npc.doCast(SkillTable.getInstance().getInfo(5435, 1));
-		}
+		npc.setTarget(player);
+		npc.doCast(SkillTable.getInstance().getInfo(5435, 1));
 		return super.onAggroRangeEnter(npc, player, isPet);
 	}
 	
-	public Sandstorms(int questId, String name, String descr)
+	public Sandstorms(String name, String descr)
 	{
-		super(questId, name, descr);
-		addAttackId(SANDSTORM);
+		super(name, descr);
+		addAggroRangeEnterId(SANDSTORM);
 	}
 	
 	public static void main(String[] args)
 	{
-		new Sandstorms(-1, Sandstorms.class.getSimpleName(), "ai");
+		new Sandstorms(Sandstorms.class.getSimpleName(), "ai");
 	}
 }

+ 19 - 7
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SearchingMaster.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -23,24 +25,34 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * Searching Master AI.
  * @author Charus
  */
-public class SearchingMaster extends L2AttackableAIScript
+public class SearchingMaster extends AbstractNpcAI
 {
-	private static final int[] mobs =
+	private static final int[] MOBS =
 	{
-		20965, 20966, 20967, 20968, 20969, 20970, 20971, 20972, 20973
+		20965,
+		20966,
+		20967,
+		20968,
+		20969,
+		20970,
+		20971,
+		20972,
+		20973
 	};
 	
-	public SearchingMaster(int questId, String name, String descr)
+	private SearchingMaster(String name, String descr)
 	{
-		super(questId, name, descr);
-		registerMobs(mobs, QuestEventType.ON_ATTACK);
+		super(name, descr);
+		addAttackId(MOBS);
 	}
 	
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isPet)
 	{
 		if (player == null)
+		{
 			return null;
+		}
 		
 		npc.setIsRunning(true);
 		((L2Attackable) npc).addDamageHate(player, 0, 999);
@@ -51,6 +63,6 @@ public class SearchingMaster extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new SearchingMaster(-1, SearchingMaster.class.getSimpleName(), "ai");
+		new SearchingMaster(SearchingMaster.class.getSimpleName(), "ai");
 	}
 }

+ 23 - 45
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeeThroughSilentMove.java

@@ -14,6 +14,8 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -24,57 +26,33 @@ import com.l2jserver.gameserver.util.Util;
  * See Through Silent Move AI.
  * @author Gigiikun
  */
-public class SeeThroughSilentMove extends L2AttackableAIScript
+public class SeeThroughSilentMove extends AbstractNpcAI
 {
+	//@formatter:off
 	private static final int[] MOBIDS =
 	{
-		18001,
-		18002,
-		22199,
-		22215,
-		22216,
-		22217,
-		22327,
-		22746,
-		22747,
-		22748,
-		22749,
-		22750,
-		22751,
-		22752,
-		22753,
-		22754,
-		22755,
-		22756,
-		22757,
-		22758,
-		22759,
-		22760,
-		22761,
-		22762,
-		22763,
-		22764,
-		22765,
-		22794,
-		22795,
-		22796,
-		22797,
-		22798,
-		22799,
-		22800,
-		29009,
-		29010,
-		29011,
-		29012,
-		29013
+		18001, 18002, 22199,
+		22215, 22216, 22217,
+		22327, 22746, 22747,
+		22748, 22749, 22750,
+		22751, 22752, 22753,
+		22754, 22755, 22756,
+		22757, 22758, 22759,
+		22760, 22761, 22762,
+		22763, 22764, 22765,
+		22794, 22795, 22796,
+		22797, 22798, 22799,
+		22800, 29009, 29010,
+		29011, 29012, 29013
 	};
+	//@formatter:on
 	
-	public SeeThroughSilentMove(int questId, String name, String descr)
+	private SeeThroughSilentMove(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		for (L2Spawn npc : SpawnTable.getInstance().getSpawnTable())
 		{
-			if (Util.contains(MOBIDS, npc.getNpcid()) && (npc.getLastSpawn() != null) && (npc.getLastSpawn() instanceof L2Attackable))
+			if (Util.contains(MOBIDS, npc.getNpcid()) && (npc.getLastSpawn() != null) && npc.getLastSpawn().isL2Attackable())
 			{
 				((L2Attackable) npc.getLastSpawn()).setSeeThroughSilentMove(true);
 			}
@@ -85,7 +63,7 @@ public class SeeThroughSilentMove extends L2AttackableAIScript
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (npc instanceof L2Attackable)
+		if (npc.isL2Attackable())
 		{
 			((L2Attackable) npc).setSeeThroughSilentMove(true);
 		}
@@ -94,6 +72,6 @@ public class SeeThroughSilentMove extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new SeeThroughSilentMove(-1, SeeThroughSilentMove.class.getSimpleName(), "ai");
+		new SeeThroughSilentMove(SeeThroughSilentMove.class.getSimpleName(), "ai");
 	}
 }

+ 148 - 86
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeedOfAnnihilation.java

@@ -18,6 +18,7 @@ import java.util.Calendar;
 import java.util.Map;
 
 import javolution.util.FastMap;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SpawnTable;
@@ -28,7 +29,6 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.type.L2EffectZone;
 import com.l2jserver.gameserver.util.Util;
@@ -37,61 +37,36 @@ import com.l2jserver.gameserver.util.Util;
  * Seed Of Annihilation AI.
  * @author Gigiikun
  */
-public class SeedOfAnnihilation extends Quest
+public class SeedOfAnnihilation extends AbstractNpcAI
 {
 	private static final Map<Integer, Location> _teleportZones = new FastMap<>();
 	private static final int ANNIHILATION_FURNACE = 18928;
-
+	
 	// Strength, Agility, Wisdom
 	private static final int[] ZONE_BUFFS =
 	{
-		0, 6443, 6444, 6442
+		0,
+		6443,
+		6444,
+		6442
 	};
 	
+	//@formatter:off
 	private static final int[][] ZONE_BUFFS_LIST =
 	{
-		{
-			1, 2, 3
-		},
-		{
-			1, 3, 2
-		},
-		{
-			2, 1, 3
-		},
-		{
-			2, 3, 1
-		},
-		{
-			3, 2, 1
-		},
-		{
-			3, 1, 2
-		}
+		{1, 2, 3},
+		{1, 3, 2},
+		{2, 1, 3},
+		{2, 3, 1},
+		{3, 2, 1},
+		{3, 1, 2}
 	};
+	//@formatter:on
 	
 	// 0: Bistakon, 1: Reptilikon, 2: Cokrakon
 	private final SeedRegion[] _regionsData = new SeedRegion[3];
 	private Long _seedsNextStatusChange;
 	
-	private static class SeedRegion
-	{
-		public int[] elite_mob_ids;
-		public int[][] minion_lists;
-		public int buff_zone;
-		public int[][] af_spawns;
-		public L2Npc[] af_npcs = new L2Npc[2];
-		public int activeBuff = 0;
-		
-		public SeedRegion(int[] emi, int[][] ml, int bz, int[][] as)
-		{
-			elite_mob_ids = emi;
-			minion_lists = ml;
-			buff_zone = bz;
-			af_spawns = as;
-		}
-	}
-	
 	static
 	{
 		_teleportZones.put(60002, new Location(-213175, 182648, -10992));
@@ -100,92 +75,160 @@ public class SeedOfAnnihilation extends Quest
 		_teleportZones.put(60005, new Location(-179275, 186802, -10720));
 	}
 	
+	private SeedOfAnnihilation(String name, String descr)
+	{
+		super(name, descr);
+		loadSeedRegionData();
+		for (int i : _teleportZones.keySet())
+		{
+			addEnterZoneId(i);
+		}
+		for (SeedRegion element : _regionsData)
+		{
+			for (int elite_mob_id : element.elite_mob_ids)
+			{
+				addSpawnId(elite_mob_id);
+			}
+		}
+		addStartNpc(32739);
+		addTalkId(32739);
+		initialMinionsSpawn();
+		startEffectZonesControl();
+	}
+	
 	public void loadSeedRegionData()
 	{
 		// Bistakon data
 		_regionsData[0] = new SeedRegion(new int[]
 		{
-			22750, 22751, 22752, 22753
+			22750,
+			22751,
+			22752,
+			22753
 		}, new int[][]
 		{
 			{
-				22746, 22746, 22746
+				22746,
+				22746,
+				22746
 			},
 			{
-				22747, 22747, 22747
+				22747,
+				22747,
+				22747
 			},
 			{
-				22748, 22748, 22748
+				22748,
+				22748,
+				22748
 			},
 			{
-				22749, 22749, 22749
+				22749,
+				22749,
+				22749
 			}
 		}, 60006, new int[][]
 		{
 			{
-				-180450, 185507, -10544, 11632
+				-180450,
+				185507,
+				-10544,
+				11632
 			},
 			{
-				-180005, 185489, -10544, 11632
+				-180005,
+				185489,
+				-10544,
+				11632
 			}
 		});
 		
 		// Reptilikon data
 		_regionsData[1] = new SeedRegion(new int[]
 		{
-			22757, 22758, 22759
+			22757,
+			22758,
+			22759
 		}, new int[][]
 		{
 			{
-				22754, 22755, 22756
+				22754,
+				22755,
+				22756
 			}
 		}, 60007, new int[][]
 		{
 			{
-				-179600, 186998, -10704, 11632
+				-179600,
+				186998,
+				-10704,
+				11632
 			},
 			{
-				-179295, 186444, -10704, 11632
+				-179295,
+				186444,
+				-10704,
+				11632
 			}
 		});
 		
 		// Cokrakon data
 		_regionsData[2] = new SeedRegion(new int[]
 		{
-			22763, 22764, 22765
+			22763,
+			22764,
+			22765
 		}, new int[][]
 		{
 			{
-				22760, 22760, 22761
+				22760,
+				22760,
+				22761
 			},
 			{
-				22760, 22760, 22762
+				22760,
+				22760,
+				22762
 			},
 			{
-				22761, 22761, 22760
+				22761,
+				22761,
+				22760
 			},
 			{
-				22761, 22761, 22762
+				22761,
+				22761,
+				22762
 			},
 			{
-				22762, 22762, 22760
+				22762,
+				22762,
+				22760
 			},
 			{
-				22762, 22762, 22761
+				22762,
+				22762,
+				22761
 			}
 		}, 60008, new int[][]
 		{
 			{
-				-180971, 186361, -10528, 11632
+				-180971,
+				186361,
+				-10528,
+				11632
 			},
 			{
-				-180758, 186739, -10528, 11632
+				-180758,
+				186739,
+				-10528,
+				11632
 			}
 		});
 		
 		int buffsNow = 0;
 		String var = loadGlobalQuestVar("SeedNextStatusChange");
-		if (var.equalsIgnoreCase("") || Long.parseLong(var) < System.currentTimeMillis())
+		if (var.equalsIgnoreCase("") || (Long.parseLong(var) < System.currentTimeMillis()))
 		{
 			buffsNow = getRandom(ZONE_BUFFS_LIST.length);
 			saveGlobalQuestVar("SeedBuffsList", String.valueOf(buffsNow));
@@ -197,8 +240,10 @@ public class SeedOfAnnihilation extends Quest
 			_seedsNextStatusChange = Long.parseLong(var);
 			buffsNow = Integer.parseInt(loadGlobalQuestVar("SeedBuffsList"));
 		}
-		for(int i = 0; i < _regionsData.length; i++)
+		for (int i = 0; i < _regionsData.length; i++)
+		{
 			_regionsData[i].activeBuff = ZONE_BUFFS_LIST[buffsNow][i];
+		}
 	}
 	
 	private Long getNextSeedsStatusChangeTime()
@@ -209,25 +254,12 @@ public class SeedOfAnnihilation extends Quest
 		reenter.set(Calendar.HOUR_OF_DAY, 13);
 		reenter.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
 		if (reenter.getTimeInMillis() <= System.currentTimeMillis())
+		{
 			reenter.add(Calendar.DAY_OF_MONTH, 7);
+		}
 		return reenter.getTimeInMillis();
 	}
 	
-	public SeedOfAnnihilation(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		loadSeedRegionData();
-		for (int i : _teleportZones.keySet())
-			addEnterZoneId(i);
-		for (int i = 0; i < _regionsData.length; i++)
-			for (int j = 0; j < _regionsData[i].elite_mob_ids.length; j++)
-				addSpawnId(_regionsData[i].elite_mob_ids[j]);
-		addStartNpc(32739);
-		addTalkId(32739);
-		initialMinionsSpawn();
-		startEffectZonesControl();
-	}
-	
 	private void startEffectZonesControl()
 	{
 		for (int i = 0; i < _regionsData.length; i++)
@@ -247,14 +279,18 @@ public class SeedOfAnnihilation extends Quest
 		for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable())
 		{
 			if (spawn == null)
+			{
 				continue;
-			for (int i = 0; i < _regionsData.length; i++)
+			}
+			for (SeedRegion element : _regionsData)
 			{
-				if (Util.contains(_regionsData[i].elite_mob_ids, spawn.getNpcid()))
+				if (Util.contains(element.elite_mob_ids, spawn.getNpcid()))
 				{
 					L2MonsterInstance mob = (L2MonsterInstance) spawn.getLastSpawn();
 					if (mob != null)
-						spawnGroupOfMinion(mob, _regionsData[i].minion_lists[getRandom(_regionsData[i].minion_lists.length)]);
+					{
+						spawnGroupOfMinion(mob, element.minion_lists[getRandom(element.minion_lists.length)]);
+					}
 				}
 			}
 		}
@@ -262,17 +298,21 @@ public class SeedOfAnnihilation extends Quest
 	
 	private void spawnGroupOfMinion(L2MonsterInstance npc, int[] mobIds)
 	{
-		for (int i = 0; i < mobIds.length; i++)
-			addMinion(npc, mobIds[i]);
+		for (int mobId : mobIds)
+		{
+			addMinion(npc, mobId);
+		}
 	}
 	
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		for (int i = 0; i < _regionsData.length; i++)
+		for (SeedRegion element : _regionsData)
 		{
-			if (Util.contains(_regionsData[i].elite_mob_ids, npc.getNpcId()))
-				spawnGroupOfMinion((L2MonsterInstance) npc, _regionsData[i].minion_lists[getRandom(_regionsData[i].minion_lists.length)]);
+			if (Util.contains(element.elite_mob_ids, npc.getNpcId()))
+			{
+				spawnGroupOfMinion((L2MonsterInstance) npc, element.minion_lists[getRandom(element.minion_lists.length)]);
+			}
 		}
 		return super.onSpawn(npc);
 	}
@@ -291,7 +331,9 @@ public class SeedOfAnnihilation extends Quest
 				_regionsData[i].activeBuff = ZONE_BUFFS_LIST[buffsNow][i];
 				
 				for (L2Npc af : _regionsData[i].af_npcs)
+				{
 					af.setDisplayEffect(_regionsData[i].activeBuff);
+				}
 				
 				L2EffectZone zone = ZoneManager.getInstance().getZoneById(_regionsData[i].buff_zone, L2EffectZone.class);
 				zone.clearSkills();
@@ -302,7 +344,9 @@ public class SeedOfAnnihilation extends Quest
 		else if (event.equalsIgnoreCase("transform"))
 		{
 			if (player.getFirstEffect(6408) != null)
+			{
 				npc.showChatWindow(player, 2);
+			}
 			else
 			{
 				npc.setTarget(player);
@@ -331,8 +375,26 @@ public class SeedOfAnnihilation extends Quest
 		return super.onEnterZone(character, zone);
 	}
 	
+	private static class SeedRegion
+	{
+		public int[] elite_mob_ids;
+		public int[][] minion_lists;
+		public int buff_zone;
+		public int[][] af_spawns;
+		public L2Npc[] af_npcs = new L2Npc[2];
+		public int activeBuff = 0;
+		
+		public SeedRegion(int[] emi, int[][] ml, int bz, int[][] as)
+		{
+			elite_mob_ids = emi;
+			minion_lists = ml;
+			buff_zone = bz;
+			af_spawns = as;
+		}
+	}
+	
 	public static void main(String[] args)
 	{
-		new SeedOfAnnihilation(-1, SeedOfAnnihilation.class.getSimpleName(), "ai");
+		new SeedOfAnnihilation(SeedOfAnnihilation.class.getSimpleName(), "ai");
 	}
 }

+ 15 - 13
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Slaves.java

@@ -16,6 +16,8 @@ package ai.group_template;
 
 import java.util.List;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.instancemanager.HellboundManager;
 import com.l2jserver.gameserver.model.L2CharPosition;
@@ -31,15 +33,25 @@ import com.l2jserver.gameserver.taskmanager.DecayTaskManager;
  * Hellbound Slaves AI.
  * @author DS
  */
-public class Slaves extends L2AttackableAIScript
+public class Slaves extends AbstractNpcAI
 {
 	private static final int[] MASTERS =
 	{
-		22320, 22321
+		22320,
+		22321
 	};
+	
 	private static final L2CharPosition MOVE_TO = new L2CharPosition(-25451, 252291, -3252, 3500);
+	
 	private static final int TRUST_REWARD = 10;
 	
+	private Slaves(String name, String descr)
+	{
+		super(name, descr);
+		addSpawnId(MASTERS);
+		addKillId(MASTERS);
+	}
+	
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
@@ -83,18 +95,8 @@ public class Slaves extends L2AttackableAIScript
 		return super.onKill(npc, killer, isPet);
 	}
 	
-	public Slaves(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		for (int npcId : MASTERS)
-		{
-			addSpawnId(npcId);
-			addKillId(npcId);
-		}
-	}
-	
 	public static void main(String[] args)
 	{
-		new Slaves(-1, Slaves.class.getSimpleName(), "ai");
+		new Slaves(Slaves.class.getSimpleName(), "ai");
 	}
 }

+ 108 - 64
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/StakatoNest.java

@@ -16,6 +16,8 @@ package ai.group_template;
 
 import java.util.List;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.model.L2Object;
@@ -32,55 +34,90 @@ import com.l2jserver.gameserver.util.Util;
  * Stakato Nest AI.
  * @author Gnacik
  */
-public class StakatoNest extends L2AttackableAIScript
+public class StakatoNest extends AbstractNpcAI
 {
 	// List of all mobs just for register
-	private static final int[] _stakato_mobs =
+	private static final int[] STAKATO_MOBS =
 	{
-		18793, 18794, 18795, 18796, 18797, 18798, 22617, 22618, 22619, 22620, 22621, 22622, 22623, 22624, 22625, 22626, 22627, 22628, 22629, 22630, 22631, 22632, 22633, 25667
+		18793,
+		18794,
+		18795,
+		18796,
+		18797,
+		18798,
+		22617,
+		22618,
+		22619,
+		22620,
+		22621,
+		22622,
+		22623,
+		22624,
+		22625,
+		22626,
+		22627,
+		22628,
+		22629,
+		22630,
+		22631,
+		22632,
+		22633,
+		25667
 	};
+	
 	// Coocons
-	private static final int[] _cocoons =
+	private static final int[] COCOONS =
 	{
-		18793, 18794, 18795, 18796, 18797, 18798
+		18793,
+		18794,
+		18795,
+		18796,
+		18797,
+		18798
 	};
 	
 	// Cannibalistic Stakato Leader
-	private static final int _stakato_leader = 22625;
+	private static final int STAKATO_LEADER = 22625;
 	
 	// Spike Stakato Nurse
-	private static final int _stakato_nurse = 22630;
+	private static final int STAKATO_NURSE = 22630;
 	// Spike Stakato Nurse (Changed)
-	private static final int _stakato_nurse_2 = 22631;
+	private static final int STAKATO_NURSE_2 = 22631;
 	// Spiked Stakato Baby
-	private static final int _stakato_baby = 22632;
+	private static final int STAKATO_BABY = 22632;
 	// Spiked Stakato Captain
-	private static final int _stakato_captain = 22629;
+	private static final int STAKATO_CAPTAIN = 22629;
 	
 	// Female Spiked Stakato
-	private static final int _stakato_female = 22620;
+	private static final int STAKATO_FEMALE = 22620;
 	// Male Spiked Stakato
-	private static final int _stakato_male = 22621;
+	private static final int STAKATO_MALE = 22621;
 	// Male Spiked Stakato (Changed)
-	private static final int _stakato_male_2 = 22622;
+	private static final int STAKATO_MALE_2 = 22622;
 	// Spiked Stakato Guard
-	private static final int _stakato_guard = 22619;
+	private static final int STAKATO_GUARD = 22619;
 	
 	// Cannibalistic Stakato Chief
-	private static final int _stakato_chief = 25667;
+	private static final int STAKATO_CHIEF = 25667;
 	// Growth Accelerator
-	private static final int _growth_accelerator = 2905;
+	private static final int GROWTH_ACCELERATOR = 2905;
 	// Small Stakato Cocoon
-	private static final int _small_cocoon = 14833;
+	private static final int SMALL_COCOON = 14833;
 	// Large Stakato Cocoon
-	private static final int _large_cocoon = 14834;
+	private static final int LARGE_COCOON = 14834;
+	
+	private StakatoNest(String name, String descr)
+	{
+		super(name, descr);
+		registerMobs(STAKATO_MOBS);
+	}
 	
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
 	{
-		L2MonsterInstance _mob = (L2MonsterInstance) npc;
+		L2MonsterInstance mob = (L2MonsterInstance) npc;
 		
-		if ((_mob.getNpcId() == _stakato_leader) && (getRandom(1000) < 100) && (_mob.getCurrentHp() < (_mob.getMaxHp() * 0.3)))
+		if ((mob.getNpcId() == STAKATO_LEADER) && (getRandom(1000) < 100) && (mob.getCurrentHp() < (mob.getMaxHp() * 0.3)))
 		{
 			L2MonsterInstance _follower = checkMinion(npc);
 			
@@ -90,11 +127,11 @@ public class StakatoNest extends L2AttackableAIScript
 				
 				if (_hp > (_follower.getMaxHp() * 0.3))
 				{
-					_mob.abortAttack();
-					_mob.abortCast();
-					_mob.setHeading(Util.calculateHeadingFrom(_mob, _follower));
-					_mob.doCast(SkillTable.getInstance().getInfo(4484, 1));
-					_mob.setCurrentHp(_mob.getCurrentHp() + _hp);
+					mob.abortAttack();
+					mob.abortCast();
+					mob.setHeading(Util.calculateHeadingFrom(mob, _follower));
+					mob.doCast(SkillTable.getInstance().getInfo(4484, 1));
+					mob.setCurrentHp(mob.getCurrentHp() + _hp);
 					_follower.doDie(_follower);
 					_follower.deleteMe();
 				}
@@ -108,50 +145,54 @@ public class StakatoNest extends L2AttackableAIScript
 	{
 		L2MonsterInstance _minion = checkMinion(npc);
 		
-		if (npc.getNpcId() == _stakato_nurse && _minion != null)
+		if ((npc.getNpcId() == STAKATO_NURSE) && (_minion != null))
 		{
 			Broadcast.toSelfAndKnownPlayers(npc, new MagicSkillUse(npc, 2046, 1, 1000, 0));
 			for (int i = 0; i < 3; i++)
 			{
-				L2Npc _spawned = addSpawn(_stakato_captain, _minion, true);
+				L2Npc _spawned = addSpawn(STAKATO_CAPTAIN, _minion, true);
 				attackPlayer(killer, _spawned);
 			}
 		}
-		else if (npc.getNpcId() == _stakato_baby)
+		else if (npc.getNpcId() == STAKATO_BABY)
 		{
-			L2MonsterInstance _leader = ((L2MonsterInstance) npc).getLeader();
-			if (_leader != null && !_leader.isDead())
+			L2MonsterInstance leader = ((L2MonsterInstance) npc).getLeader();
+			if ((leader != null) && !leader.isDead())
 			{
-				startQuestTimer("nurse_change", 5000, _leader, killer);
+				startQuestTimer("nurse_change", 5000, leader, killer);
 			}
 		}
-		else if (npc.getNpcId() == _stakato_male && _minion != null)
+		else if ((npc.getNpcId() == STAKATO_MALE) && (_minion != null))
 		{
 			Broadcast.toSelfAndKnownPlayers(npc, new MagicSkillUse(npc, 2046, 1, 1000, 0));
 			for (int i = 0; i < 3; i++)
 			{
-				L2Npc _spawned = addSpawn(_stakato_guard, _minion, true);
+				L2Npc _spawned = addSpawn(STAKATO_GUARD, _minion, true);
 				attackPlayer(killer, _spawned);
 			}
 		}
-		else if (npc.getNpcId() == _stakato_female)
+		else if (npc.getNpcId() == STAKATO_FEMALE)
 		{
-			L2MonsterInstance _leader = ((L2MonsterInstance) npc).getLeader();
-			if (_leader != null && !_leader.isDead())
+			L2MonsterInstance leader = ((L2MonsterInstance) npc).getLeader();
+			if ((leader != null) && !leader.isDead())
 			{
-				startQuestTimer("male_change", 5000, _leader, killer);
+				startQuestTimer("male_change", 5000, leader, killer);
 			}
 		}
-		else if (npc.getNpcId() == _stakato_chief)
+		else if (npc.getNpcId() == STAKATO_CHIEF)
 		{
 			if (killer.isInParty())
 			{
 				List<L2PcInstance> party = killer.getParty().getMembers();
 				for (L2PcInstance member : party)
+				{
 					giveCocoon(member, npc);
+				}
 			}
 			else
+			{
 				giveCocoon(killer, npc);
+			}
 		}
 		return super.onKill(npc, killer, isPet);
 	}
@@ -159,11 +200,11 @@ public class StakatoNest extends L2AttackableAIScript
 	@Override
 	public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
 	{
-		if (Util.contains(_cocoons, npc.getNpcId()) && Util.contains(targets, npc) && skill.getId() == _growth_accelerator)
+		if (Util.contains(COCOONS, npc.getNpcId()) && 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);
-			attackPlayer(caster, _spawned);
+			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, isPet);
 	}
@@ -172,55 +213,49 @@ public class StakatoNest extends L2AttackableAIScript
 	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
 		if ((npc == null) || (player == null))
+		{
 			return null;
+		}
 		if (npc.isDead())
+		{
 			return null;
+		}
 		
 		if (event.equalsIgnoreCase("nurse_change"))
 		{
 			npc.getSpawn().decreaseCount(npc);
 			npc.deleteMe();
-			L2Npc _spawned = addSpawn(_stakato_nurse_2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, true);
+			L2Npc _spawned = addSpawn(STAKATO_NURSE_2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, true);
 			attackPlayer(player, _spawned);
 		}
 		else if (event.equalsIgnoreCase("male_change"))
 		{
 			npc.getSpawn().decreaseCount(npc);
 			npc.deleteMe();
-			L2Npc _spawned = addSpawn(_stakato_male_2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, true);
+			L2Npc _spawned = addSpawn(STAKATO_MALE_2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, true);
 			attackPlayer(player, _spawned);
 		}
 		return null;
 	}
 	
-	public StakatoNest(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		
-		this.registerMobs(_stakato_mobs);
-	}
-	
-	public static void main(String[] args)
-	{
-		new StakatoNest(-1, StakatoNest.class.getSimpleName(), "ai");
-	}
-	
-	private L2MonsterInstance checkMinion(L2Npc npc)
+	private static L2MonsterInstance checkMinion(L2Npc npc)
 	{
 		L2MonsterInstance mob = (L2MonsterInstance) npc;
 		if (mob.hasMinions())
 		{
-			List<L2MonsterInstance> _minion = mob.getMinionList().getSpawnedMinions();
-			if ((_minion != null) && !_minion.isEmpty() && (_minion.get(0) != null) && !_minion.get(0).isDead())
-				return _minion.get(0);
+			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;
 	}
 	
-	private void attackPlayer(L2PcInstance player, L2Npc npc)
+	private static void attackPlayer(L2PcInstance player, L2Npc npc)
 	{
-		if (npc != null && player != null)
+		if ((npc != null) && (player != null))
 		{
 			((L2Attackable) npc).setIsRunning(true);
 			((L2Attackable) npc).addDamageHate(player, 0, 999);
@@ -228,11 +263,20 @@ public class StakatoNest extends L2AttackableAIScript
 		}
 	}
 	
-	private void giveCocoon(L2PcInstance player, L2Npc npc)
+	private static void giveCocoon(L2PcInstance player, L2Npc npc)
 	{
 		if (getRandom(100) > 80)
-			player.addItem("StakatoCocoon", _large_cocoon, 1, npc, true);
+		{
+			player.addItem("StakatoCocoon", LARGE_COCOON, 1, npc, true);
+		}
 		else
-			player.addItem("StakatoCocoon", _small_cocoon, 1, npc, true);
+		{
+			player.addItem("StakatoCocoon", SMALL_COCOON, 1, npc, true);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new StakatoNest(StakatoNest.class.getSimpleName(), "ai");
 	}
 }

+ 9 - 8
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/StarStones.java

@@ -14,20 +14,21 @@
  */
 package ai.group_template;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.util.Util;
 
 /**
  * Star Stones AI.
  * @author Gigiikun
  */
-public class StarStones extends L2AttackableAIScript
+public class StarStones extends AbstractNpcAI
 {
-	private static final int[] mobs =
+	private static final int[] MOBS =
 	{
 		18684,
 		18685,
@@ -42,16 +43,16 @@ public class StarStones extends L2AttackableAIScript
 	
 	private static final int RATE = 1;
 	
-	public StarStones(int questId, String name, String descr)
+	private StarStones(String name, String descr)
 	{
-		super(questId, name, descr);
-		registerMobs(mobs, QuestEventType.ON_SKILL_SEE);
+		super(name, descr);
+		registerMobs(MOBS, QuestEventType.ON_SKILL_SEE);
 	}
 	
 	@Override
 	public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
 	{
-		if (Util.contains(targets, npc) && (skill.getId() == 932))
+		if (skill.getId() == 932)
 		{
 			int itemId = 0;
 			
@@ -100,6 +101,6 @@ public class StarStones extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new StarStones(-1, StarStones.class.getSimpleName(), "ai");
+		new StarStones(StarStones.class.getSimpleName(), "ai");
 	}
 }

+ 93 - 104
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SummonMinions.java

@@ -16,13 +16,14 @@ package ai.group_template;
 
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
+import javolution.util.FastSet;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -33,14 +34,13 @@ import com.l2jserver.gameserver.network.clientpackets.Say2;
 import com.l2jserver.gameserver.network.serverpackets.NpcSay;
 
 /**
- * Summon Minions AI.
- * Based on work of Slyce.
+ * Summon Minions AI. Based on work of Slyce.
  * @author Sandro
  */
-public class SummonMinions extends L2AttackableAIScript
+public class SummonMinions extends AbstractNpcAI
 {
 	private static int HasSpawned;
-	private static Set<Integer> myTrackingSet = new HashSet<>(); // Used to track instances of npcs
+	private static Set<Integer> myTrackingSet = new FastSet<Integer>().shared(); // Used to track instances of npcs
 	private final FastMap<Integer, FastList<L2PcInstance>> _attackersList = new FastMap<Integer, FastList<L2PcInstance>>().shared();
 	private static final Map<Integer, List<Integer>> MINIONS = new HashMap<>();
 	
@@ -84,9 +84,9 @@ public class SummonMinions extends L2AttackableAIScript
 		MINIONS.put(22774, Arrays.asList(22768, 22768));
 	}
 	
-	public SummonMinions(int questId, String name, String descr)
+	private SummonMinions(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		registerMobs(MINIONS.keySet(), QuestEventType.ON_ATTACK, QuestEventType.ON_KILL);
 	}
 	
@@ -95,124 +95,118 @@ public class SummonMinions extends L2AttackableAIScript
 	{
 		int npcId = npc.getNpcId();
 		int npcObjId = npc.getObjectId();
-		if (MINIONS.containsKey(npcId))
+		
+		if (!myTrackingSet.contains(npcObjId)) // this allows to handle multiple instances of npc
 		{
-			if (!myTrackingSet.contains(npcObjId)) // this allows to handle multiple instances of npc
-			{
-				synchronized (myTrackingSet)
-				{
-					myTrackingSet.add(npcObjId);
-				}
-				
-				HasSpawned = npcObjId;
-			}
-			if (HasSpawned == npcObjId)
+			myTrackingSet.add(npcObjId);
+			HasSpawned = npcObjId;
+		}
+		if (HasSpawned == npcObjId)
+		{
+			switch (npcId)
 			{
-				switch (npcId)
+				case 22030: // mobs that summon minions only on certain hp
+				case 22032:
+				case 22038:
 				{
-					case 22030: // mobs that summon minions only on certain hp
-					case 22032:
-					case 22038:
+					if (npc.getCurrentHp() < (npc.getMaxHp() / 2.0))
 					{
-						if (npc.getCurrentHp() < (npc.getMaxHp() / 2.0))
+						HasSpawned = 0;
+						if (getRandom(100) < 33) // mobs that summon minions only on certain chance
 						{
-							HasSpawned = 0;
-							if (getRandom(100) < 33) // mobs that summon minions only on certain chance
+							for (int val : MINIONS.get(npcId))
 							{
-								for (int val : MINIONS.get(npcId))
-								{
-									L2Attackable newNpc = (L2Attackable) this.addSpawn(val, (npc.getX() + getRandom(-150, 150)), (npc.getY() + getRandom(-150, 150)), npc.getZ(), 0, false, 0);
-									newNpc.setRunning();
-									newNpc.addDamageHate(attacker, 0, 999);
-									newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
-								}
+								L2Attackable newNpc = (L2Attackable) this.addSpawn(val, (npc.getX() + getRandom(-150, 150)), (npc.getY() + getRandom(-150, 150)), npc.getZ(), 0, false, 0);
+								newNpc.setRunning();
+								newNpc.addDamageHate(attacker, 0, 999);
+								newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
 							}
 						}
-						break;
 					}
-					case 22257:
-					case 22258:
-					case 22259:
-					case 22260:
-					case 22261:
-					case 22262:
-					case 22263:
-					case 22264:
-					case 22265:
-					case 22266:
+					break;
+				}
+				case 22257:
+				case 22258:
+				case 22259:
+				case 22260:
+				case 22261:
+				case 22262:
+				case 22263:
+				case 22264:
+				case 22265:
+				case 22266:
+				{
+					if (isPet)
 					{
-						if (isPet)
-						{
-							attacker = (attacker).getPet().getOwner();
-						}
-						if (attacker.getParty() != null)
-						{
-							for (L2PcInstance member : attacker.getParty().getMembers())
-							{
-								if (_attackersList.get(npcObjId) == null)
-								{
-									FastList<L2PcInstance> player = new FastList<>();
-									player.add(member);
-									_attackersList.put(npcObjId, player);
-								}
-								else if (!_attackersList.get(npcObjId).contains(member))
-								{
-									_attackersList.get(npcObjId).add(member);
-								}
-							}
-						}
-						else
+						attacker = (attacker).getPet().getOwner();
+					}
+					if (attacker.getParty() != null)
+					{
+						for (L2PcInstance member : attacker.getParty().getMembers())
 						{
 							if (_attackersList.get(npcObjId) == null)
 							{
 								FastList<L2PcInstance> player = new FastList<>();
-								player.add(attacker);
+								player.add(member);
 								_attackersList.put(npcObjId, player);
 							}
-							else if (!_attackersList.get(npcObjId).contains(attacker))
+							else if (!_attackersList.get(npcObjId).contains(member))
 							{
-								_attackersList.get(npcObjId).add(attacker);
+								_attackersList.get(npcObjId).add(member);
 							}
 						}
-						if (((attacker.getParty() != null) && (attacker.getParty().getMemberCount() > 2)) || (_attackersList.get(npcObjId).size() > 2)) // Just to make sure..
+					}
+					else
+					{
+						if (_attackersList.get(npcObjId) == null)
 						{
-							HasSpawned = 0;
-							for (int val : MINIONS.get(npcId))
-							{
-								L2Attackable newNpc = (L2Attackable) this.addSpawn(val, npc.getX() + getRandom(-150, 150), npc.getY() + getRandom(-150, 150), npc.getZ(), 0, false, 0);
-								newNpc.setRunning();
-								newNpc.addDamageHate(attacker, 0, 999);
-								newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
-							}
+							FastList<L2PcInstance> player = new FastList<>();
+							player.add(attacker);
+							_attackersList.put(npcObjId, player);
+						}
+						else if (!_attackersList.get(npcObjId).contains(attacker))
+						{
+							_attackersList.get(npcObjId).add(attacker);
 						}
-						break;
 					}
-					default: // mobs without special conditions
+					if (((attacker.getParty() != null) && (attacker.getParty().getMemberCount() > 2)) || (_attackersList.get(npcObjId).size() > 2)) // Just to make sure..
 					{
 						HasSpawned = 0;
-						if (npcId != 20767)
+						for (int val : MINIONS.get(npcId))
 						{
-							for (int val : MINIONS.get(npcId))
-							{
-								L2Attackable newNpc = (L2Attackable) this.addSpawn(val, npc.getX() + getRandom(-150, 150), npc.getY() + getRandom(-150, 150), npc.getZ(), 0, false, 0);
-								newNpc.setRunning();
-								newNpc.addDamageHate(attacker, 0, 999);
-								newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
-							}
+							L2Attackable newNpc = (L2Attackable) this.addSpawn(val, npc.getX() + getRandom(-150, 150), npc.getY() + getRandom(-150, 150), npc.getZ(), 0, false, 0);
+							newNpc.setRunning();
+							newNpc.addDamageHate(attacker, 0, 999);
+							newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
 						}
-						else
+					}
+					break;
+				}
+				default: // mobs without special conditions
+				{
+					HasSpawned = 0;
+					if (npcId != 20767)
+					{
+						for (int val : MINIONS.get(npcId))
 						{
-							for (int val : MINIONS.get(npcId))
-							{
-								this.addSpawn(val, (npc.getX() + getRandom(-100, 100)), (npc.getY() + getRandom(-100, 100)), npc.getZ(), 0, false, 0);
-							}
+							L2Attackable newNpc = (L2Attackable) this.addSpawn(val, npc.getX() + getRandom(-150, 150), npc.getY() + getRandom(-150, 150), npc.getZ(), 0, false, 0);
+							newNpc.setRunning();
+							newNpc.addDamageHate(attacker, 0, 999);
+							newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
 						}
-						if (npcId == 20767)
+					}
+					else
+					{
+						for (int val : MINIONS.get(npcId))
 						{
-							npc.broadcastPacket(new NpcSay(npcObjId, Say2.NPC_ALL, npcId, NpcStringId.COME_OUT_YOU_CHILDREN_OF_DARKNESS));
+							this.addSpawn(val, (npc.getX() + getRandom(-100, 100)), (npc.getY() + getRandom(-100, 100)), npc.getZ(), 0, false, 0);
 						}
-						break;
 					}
+					if (npcId == 20767)
+					{
+						npc.broadcastPacket(new NpcSay(npcObjId, Say2.NPC_ALL, npcId, NpcStringId.COME_OUT_YOU_CHILDREN_OF_DARKNESS));
+					}
+					break;
 				}
 			}
 		}
@@ -222,16 +216,11 @@ public class SummonMinions extends L2AttackableAIScript
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
-		int npcId = npc.getNpcId();
 		int npcObjId = npc.getObjectId();
-		if (MINIONS.containsKey(npcId))
-		{
-			synchronized (myTrackingSet)
-			{
-				myTrackingSet.remove(npcObjId);
-			}
-		}
-		if (_attackersList.get(npcObjId) != null)
+		
+		myTrackingSet.remove(npcObjId);
+		
+		if (_attackersList.containsKey(npcObjId))
 		{
 			_attackersList.get(npcObjId).clear();
 		}
@@ -240,6 +229,6 @@ public class SummonMinions extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new SummonMinions(-1, SummonMinions.class.getSimpleName(), "ai");
+		new SummonMinions(SummonMinions.class.getSimpleName(), "ai");
 	}
 }

+ 16 - 11
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Amaskari.java

@@ -14,7 +14,7 @@
  */
 package ai.individual;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.instancemanager.HellboundManager;
@@ -32,7 +32,7 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  * Manages Amaskari's and minions' chat and some skill usage.
  * @author GKR
  */
-public class Amaskari extends L2AttackableAIScript
+public class Amaskari extends AbstractNpcAI
 {
 	private static final int AMASKARI = 22449;
 	private static final int AMASKARI_PRISONER = 22450;
@@ -40,28 +40,33 @@ public class Amaskari extends L2AttackableAIScript
 	private static final int BUFF_ID = 4632;
 	private static SkillHolder[] BUFF =
 	{
-		new SkillHolder(BUFF_ID, 1), 
-		new SkillHolder(BUFF_ID, 2), 
+		new SkillHolder(BUFF_ID, 1),
+		new SkillHolder(BUFF_ID, 2),
 		new SkillHolder(BUFF_ID, 3)
 	};
 	// private static SkillHolder INVINCIBILITY = new SkillHolder(5417, 1);
 	
 	private static final NpcStringId[] AMASKARI_NPCSTRING_ID =
 	{
-		NpcStringId.ILL_MAKE_EVERYONE_FEEL_THE_SAME_SUFFERING_AS_ME, NpcStringId.HA_HA_YES_DIE_SLOWLY_WRITHING_IN_PAIN_AND_AGONY, NpcStringId.MORE_NEED_MORE_SEVERE_PAIN, NpcStringId.SOMETHING_IS_BURNING_INSIDE_MY_BODY
+		NpcStringId.ILL_MAKE_EVERYONE_FEEL_THE_SAME_SUFFERING_AS_ME,
+		NpcStringId.HA_HA_YES_DIE_SLOWLY_WRITHING_IN_PAIN_AND_AGONY,
+		NpcStringId.MORE_NEED_MORE_SEVERE_PAIN,
+		NpcStringId.SOMETHING_IS_BURNING_INSIDE_MY_BODY
 	};
 	
 	private static final NpcStringId[] MINIONS_NPCSTRING_ID =
 	{
-		NpcStringId.AHH_MY_LIFE_IS_BEING_DRAINED_OUT, NpcStringId.THANK_YOU_FOR_SAVING_ME, NpcStringId.IT_WILL_KILL_EVERYONE, NpcStringId.EEEK_I_FEEL_SICKYOW
+		NpcStringId.AHH_MY_LIFE_IS_BEING_DRAINED_OUT,
+		NpcStringId.THANK_YOU_FOR_SAVING_ME,
+		NpcStringId.IT_WILL_KILL_EVERYONE,
+		NpcStringId.EEEK_I_FEEL_SICKYOW
 	};
 	
-	public Amaskari(int id, String name, String descr)
+	private Amaskari(String name, String descr)
 	{
-		super(id, name, descr);
+		super(name, descr);
 		
-		addKillId(AMASKARI);
-		addKillId(AMASKARI_PRISONER);
+		addKillId(AMASKARI, AMASKARI_PRISONER);
 		addAttackId(AMASKARI);
 		addSpawnId(AMASKARI_PRISONER);
 	}
@@ -177,6 +182,6 @@ public class Amaskari extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new Amaskari(-1, "Amaskari", "ai");
+		new Amaskari(Amaskari.class.getSimpleName(), "ai");
 	}
 }

+ 13 - 17
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas.java

@@ -18,11 +18,10 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ScheduledFuture;
-import java.util.logging.Logger;
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GeoData;
@@ -53,10 +52,8 @@ import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
  * This class ... control for sequence of fight against Antharas.
  * @author L2J_JP SANDMAN
  */
-public class Antharas extends L2AttackableAIScript
+public class Antharas extends AbstractNpcAI
 {
-	protected static final Logger log = Logger.getLogger(Antharas.class.getName());
-	
 	// config
 	private static final int FWA_ACTIVITYTIMEOFANTHARAS = 120;
 	// private static final int FWA_APPTIMEOFANTHARAS = 1800000;
@@ -123,16 +120,10 @@ public class Antharas extends L2AttackableAIScript
 	
 	protected static L2BossZone _Zone;
 	
-	public static void main(String[] args)
-	{
-		// now call the constructor (starts up the ai)
-		new Antharas(-1, "antharas", "ai");
-	}
-	
 	// Boss: Antharas
-	public Antharas(int id, String name, String descr)
+	private Antharas(String name, String descr)
 	{
-		super(id, name, descr);
+		super(name, descr);
 		int[] mob =
 		{
 			ANTHARASOLDID,
@@ -148,7 +139,7 @@ public class Antharas extends L2AttackableAIScript
 			29075,
 			29076
 		};
-		this.registerMobs(mob);
+		registerMobs(mob);
 		init();
 	}
 	
@@ -212,7 +203,7 @@ public class Antharas extends L2AttackableAIScript
 		}
 		catch (Exception e)
 		{
-			log.warning(e.getMessage());
+			_log.warning(e.getMessage());
 		}
 		
 		// Setting spawn data of teleport cube.
@@ -236,7 +227,7 @@ public class Antharas extends L2AttackableAIScript
 		}
 		catch (Exception e)
 		{
-			log.warning(e.getMessage());
+			_log.warning(e.getMessage());
 		}
 		int status = GrandBossManager.getInstance().getBossStatus(ANTHARASOLDID);
 		if (FWA_OLDANTHARAS || (status == WAITING))
@@ -641,7 +632,7 @@ public class Antharas extends L2AttackableAIScript
 			}
 			catch (Exception e)
 			{
-				log.warning(e.getMessage());
+				_log.warning(e.getMessage());
 			}
 		}
 	}
@@ -975,4 +966,9 @@ public class Antharas extends L2AttackableAIScript
 		}
 		return super.onKill(npc, killer, isPet);
 	}
+	
+	public static void main(String[] args)
+	{
+		new Antharas(Antharas.class.getSimpleName(), "ai");
+	}
 }

+ 14 - 22
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Baium.java

@@ -21,10 +21,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javolution.util.FastList;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GeoData;
@@ -58,12 +57,8 @@ import com.l2jserver.gameserver.util.Util;
  * Not true with Baium. Once he gets attacked, the port to Baium closes. byebye, see you in 5 days. If nobody attacks baium for 30 minutes, he auto-despawns and unlocks the vortex
  * @author Fulminus version 0.1
  */
-public class Baium extends L2AttackableAIScript
+public class Baium extends AbstractNpcAI
 {
-	protected static final Logger log = Logger.getLogger(Baium.class.getName());
-	
-	private L2Character _target;
-	private L2Skill _skill;
 	private static final int STONE_BAIUM = 29025;
 	private static final int ANGELIC_VORTEX = 31862;
 	private static final int LIVE_BAIUM = 29020;
@@ -89,15 +84,13 @@ public class Baium extends L2AttackableAIScript
 	protected final List<L2Npc> _Minions = new ArrayList<>(5);
 	private L2BossZone _Zone;
 	
-	public Baium(int questId, String name, String descr)
+	private L2Character _target;
+	private L2Skill _skill;
+	
+	private Baium(String name, String descr)
 	{
-		super(questId, name, descr);
-		
-		int[] mob =
-		{
-			LIVE_BAIUM
-		};
-		registerMobs(mob);
+		super(name, descr);
+		registerMobs(LIVE_BAIUM);
 		
 		// Quest NPC starter initialization
 		addStartNpc(STONE_BAIUM, ANGELIC_VORTEX, TELEPORT_CUBIC);
@@ -206,7 +199,7 @@ public class Baium extends L2AttackableAIScript
 						}
 						catch (Exception e)
 						{
-							log.log(Level.WARNING, "", e);
+							_log.log(Level.WARNING, "", e);
 						}
 					}
 				}, 11100L);
@@ -318,7 +311,7 @@ public class Baium extends L2AttackableAIScript
 						}
 						catch (Throwable e)
 						{
-							log.log(Level.WARNING, "", e);
+							_log.log(Level.WARNING, "", e);
 						}
 					}
 				}, 100L);
@@ -483,7 +476,7 @@ public class Baium extends L2AttackableAIScript
 			}
 		}
 		_Minions.clear();
-		final QuestTimer timer =  getQuestTimer("skill_range", npc, null);
+		final QuestTimer timer = getQuestTimer("skill_range", npc, null);
 		if (timer != null)
 		{
 			timer.cancelAndRemove();
@@ -498,7 +491,7 @@ public class Baium extends L2AttackableAIScript
 		{
 			for (L2Object obj : objs)
 			{
-				if (obj.isPlayable() || obj instanceof L2DecoyInstance)
+				if (obj.isPlayable() || (obj instanceof L2DecoyInstance))
 				{
 					if (obj.isPlayer())
 					{
@@ -513,7 +506,7 @@ public class Baium extends L2AttackableAIScript
 						continue;
 					}
 				}
-				if (obj.isPlayable() || obj instanceof L2DecoyInstance)
+				if (obj.isPlayable() || (obj instanceof L2DecoyInstance))
 				{
 					if (Util.checkIfInRange(9000, npc, obj, true) && !((L2Character) obj).isDead())
 					{
@@ -739,7 +732,6 @@ public class Baium extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		// Quest class and state definition
-		new Baium(-1, "baium", "ai");
+		new Baium(Baium.class.getSimpleName(), "ai");
 	}
 }

+ 162 - 166
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Beleth.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.ArrayList;
 import java.util.concurrent.ScheduledFuture;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ThreadPoolManager;
@@ -53,38 +53,34 @@ import com.l2jserver.gameserver.util.Util;
  * Beleth's AI.
  * @author Treat
  */
-public class Beleth extends L2AttackableAIScript
+public class Beleth extends AbstractNpcAI
 {
-	protected static L2Npc camera;
-	protected static L2Npc camera2;
-	protected static L2Npc camera3;
-	protected static L2Npc camera4;
-	protected static L2Npc beleth;
-	protected static L2Npc priest;
-	protected static L2ZoneType _zone = null;
-	private static L2PcInstance belethKiller;
-	private static boolean debug = false;
-	protected static boolean movie = false;
-	private static boolean attacked = false;
-	private static int allowObjectId = 0;
-	private static int killed = 0;
-	protected static ScheduledFuture<?> spawnTimer = null;
-	protected static ArrayList<L2Npc> minions = new ArrayList<>();
-	private static L2Skill Bleed = SkillTable.getInstance().getInfo(5495, 1);
-	private static L2Skill Fireball = SkillTable.getInstance().getInfo(5496, 1);
-	private static L2Skill HornOfRising = SkillTable.getInstance().getInfo(5497, 1);
-	private static L2Skill Lightening = SkillTable.getInstance().getInfo(5499, 1);
+	protected static L2Npc CAMERA;
+	protected static L2Npc CAMERA2;
+	protected static L2Npc CAMERA3;
+	protected static L2Npc CAMERA4;
+	protected static L2Npc BELETH;
+	protected static L2Npc PRIEST;
+	protected static L2ZoneType ZONE = null;
+	private static L2PcInstance BELETH_KILLER;
+	private static boolean DEBUG = false;
+	protected static boolean MOVIE = false;
+	private static boolean ATTACKED = false;
+	private static int ALLOW_OBJECT_ID = 0;
+	private static int KILLED = 0;
+	protected static ScheduledFuture<?> SPAWN_TIMER = null;
+	protected static ArrayList<L2Npc> MINIONS = new ArrayList<>();
+	private static L2Skill BLEED = SkillTable.getInstance().getInfo(5495, 1);
+	private static L2Skill FIREBALL = SkillTable.getInstance().getInfo(5496, 1);
+	private static L2Skill HORN_OF_RISING = SkillTable.getInstance().getInfo(5497, 1);
+	private static L2Skill LIGHTENING = SkillTable.getInstance().getInfo(5499, 1);
 	
-	public Beleth(int id, String name, String descr)
+	private Beleth(String name, String descr)
 	{
-		super(id, name, descr);
-		_zone = ZoneManager.getInstance().getZoneById(12018);
+		super(name, descr);
+		ZONE = ZoneManager.getInstance().getZoneById(12018);
 		addEnterZoneId(12018);
-		registerMobs(new int[]
-		{
-			29118,
-			29119
-		});
+		registerMobs(29118, 29119);
 		addStartNpc(32470);
 		addTalkId(32470);
 		addFirstTalkId(29128);
@@ -131,7 +127,7 @@ public class Beleth extends L2AttackableAIScript
 	
 	public static void startSpawnTask()
 	{
-		ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(1), debug ? 10000 : 300000);
+		ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(1), DEBUG ? 10000 : 300000);
 	}
 	
 	protected static class unlock implements Runnable
@@ -184,199 +180,199 @@ public class Beleth extends L2AttackableAIScript
 				switch (_taskId)
 				{
 					case 1:
-						movie = true;
-						for (L2Character npc : _zone.getCharactersInside())
+						MOVIE = true;
+						for (L2Character npc : ZONE.getCharactersInside())
 						{
 							if (npc.isNpc())
 							{
 								npc.deleteMe();
 							}
 						}
-						camera = spawn(29120, new Location(16323, 213142, -9357, 0, instanceId));
-						camera2 = spawn(29121, new Location(16323, 210741, -9357, 0, instanceId));
-						camera3 = spawn(29122, new Location(16323, 213170, -9357, 0, instanceId));
-						camera4 = spawn(29123, new Location(16323, 214917, -9356, 0, instanceId));
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
+						CAMERA = spawn(29120, new Location(16323, 213142, -9357, 0, instanceId));
+						CAMERA2 = spawn(29121, new Location(16323, 210741, -9357, 0, instanceId));
+						CAMERA3 = spawn(29122, new Location(16323, 213170, -9357, 0, instanceId));
+						CAMERA4 = spawn(29123, new Location(16323, 214917, -9356, 0, instanceId));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(2), 300);
 						break;
 					case 2:
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 1800, -45, -45, 5000, 5000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 1800, -45, -45, 5000, 5000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(3), 4900);
 						break;
 					case 3:
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 2500, -120, -45, 5000, 5000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 2500, -120, -45, 5000, 5000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(4), 4900);
 						break;
 					case 4:
-						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 2200, 130, 0, 0, 1500, -20, 15, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA2.getObjectId(), 2200, 130, 0, 0, 1500, -20, 15, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(5), 1400);
 						break;
 					case 5:
-						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 2300, 100, 0, 2000, 4500, 0, 10, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA2.getObjectId(), 2300, 100, 0, 2000, 4500, 0, 10, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(6), 2500);
 						break;
 					case 6:
 						L2DoorInstance door = DoorTable.getInstance().getDoor(20240001);
 						door.closeMe();
-						_zone.broadcastPacket(new StaticObject(door, false));
-						_zone.broadcastPacket(new DoorStatusUpdate(door));
+						ZONE.broadcastPacket(new StaticObject(door, false));
+						ZONE.broadcastPacket(new DoorStatusUpdate(door));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(7), 1700);
 						break;
 					case 7:
-						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 1500, 210, 0, 0, 1500, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 5000, 6500, 0, 10, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA4.getObjectId(), 1500, 210, 0, 0, 1500, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA4.getObjectId(), 900, 255, 0, 5000, 6500, 0, 10, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(8), 6000);
 						break;
 					case 8:
 						spawn(29125, new Location(16323, 214917, -9356, 0, instanceId));
-						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 0, 1500, 0, 10, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA4.getObjectId(), 900, 255, 0, 0, 1500, 0, 10, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(9), 1000);
 						break;
 					case 9:
-						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 1000, 255, 0, 7000, 17000, 0, 25, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA4.getObjectId(), 1000, 255, 0, 7000, 17000, 0, 25, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(10), 3000);
 						break;
 					case 10:
-						beleth = spawn(29118, new Location(16321, 214211, -9352, 49369, instanceId));
+						BELETH = spawn(29118, new Location(16321, 214211, -9352, 49369, instanceId));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(11), 200);
 						break;
 					case 11:
-						_zone.broadcastPacket(new SocialAction(beleth.getObjectId(), 1));
+						ZONE.broadcastPacket(new SocialAction(BELETH.getObjectId(), 1));
 						for (int i = 0; i < 6; i++)
 						{
 							int x = (int) ((150 * Math.cos(i * 1.046666667)) + 16323);
 							int y = (int) ((150 * Math.sin(i * 1.046666667)) + 213059);
-							L2Npc minion = spawn(29119, new Location(x, y, -9357, 49152, beleth.getInstanceId()));
+							L2Npc minion = spawn(29119, new Location(x, y, -9357, 49152, BELETH.getInstanceId()));
 							minion.setShowSummonAnimation(true);
 							minion.decayMe();
-							minions.add(minion);
+							MINIONS.add(minion);
 						}
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(12), 6800);
 						break;
 					case 12:
-						_zone.broadcastPacket(new SpecialCamera(beleth.getObjectId(), 0, 270, -5, 0, 4000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(BELETH.getObjectId(), 0, 270, -5, 0, 4000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(13), 3500);
 						break;
 					case 13:
-						_zone.broadcastPacket(new SpecialCamera(beleth.getObjectId(), 800, 270, 10, 3000, 6000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(BELETH.getObjectId(), 800, 270, 10, 3000, 6000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(14), 5000);
 						break;
 					case 14:
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(15), 100);
 						break;
 					case 15:
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 3000, 6000, 0, 5, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 100, 270, 15, 3000, 6000, 0, 5, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(16), 1400);
 						break;
 					case 16:
-						beleth.teleToLocation(16323, 213059, -9357, 49152, false);
+						BELETH.teleToLocation(16323, 213059, -9357, 49152, false);
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(17), 200);
 						break;
 					case 17:
-						_zone.broadcastPacket(new MagicSkillUse(beleth, beleth, 5532, 1, 2000, 0));
+						ZONE.broadcastPacket(new MagicSkillUse(BELETH, BELETH, 5532, 1, 2000, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(18), 2000);
 						break;
 					case 18:
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 700, 270, 20, 1500, 8000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 700, 270, 20, 1500, 8000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(19), 6900);
 						break;
 					case 19:
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 40, 260, 0, 0, 4000, 0, 0, 1, 0));
-						for (L2Npc blth : minions)
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 40, 260, 0, 0, 4000, 0, 0, 1, 0));
+						for (L2Npc blth : MINIONS)
 						{
 							blth.spawnMe();
 						}
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(20), 3000);
 						break;
 					case 20:
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 40, 280, 0, 0, 4000, 5, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 40, 280, 0, 0, 4000, 5, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(21), 3000);
 						break;
 					case 21:
-						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 5, 250, 5, 0, 13000, 20, 15, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA3.getObjectId(), 5, 250, 5, 0, 13000, 20, 15, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(22), 1000);
 						break;
 					case 22:
-						_zone.broadcastPacket(new SocialAction(beleth.getObjectId(), 3));
+						ZONE.broadcastPacket(new SocialAction(BELETH.getObjectId(), 3));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(23), 4000);
 						break;
 					case 23:
-						_zone.broadcastPacket(new MagicSkillUse(beleth, beleth, 5533, 1, 2000, 0));
+						ZONE.broadcastPacket(new MagicSkillUse(BELETH, BELETH, 5533, 1, 2000, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(24), 6800);
 						break;
 					case 24:
-						beleth.deleteMe();
-						for (L2Npc bel : minions)
+						BELETH.deleteMe();
+						for (L2Npc bel : MINIONS)
 						{
 							bel.deleteMe();
 						}
-						minions.clear();
+						MINIONS.clear();
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(25), 1000);
 						break;
 					case 25:
-						camera.deleteMe();
-						camera2.deleteMe();
-						camera3.deleteMe();
-						camera4.deleteMe();
-						movie = false;
+						CAMERA.deleteMe();
+						CAMERA2.deleteMe();
+						CAMERA3.deleteMe();
+						CAMERA4.deleteMe();
+						MOVIE = false;
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
 						break;
 					case 26:
-						if (spawnTimer != null)
+						if (SPAWN_TIMER != null)
 						{
-							spawnTimer.cancel(false);
+							SPAWN_TIMER.cancel(false);
 							setSpawnTimer(0);
 						}
 						SpawnBeleths();
 						break;
 					case 27:
-						beleth.doDie(null);
-						camera = spawn(29122, new Location(16323, 213170, -9357, 0, instanceId));
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 110, 25, 4000, 10000, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SocialAction(beleth.getObjectId(), 5));
+						BELETH.doDie(null);
+						CAMERA = spawn(29122, new Location(16323, 213170, -9357, 0, instanceId));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 110, 25, 4000, 10000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SocialAction(BELETH.getObjectId(), 5));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(28), 4000);
 						break;
 					case 28:
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 295, 25, 4000, 5000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 295, 25, 4000, 5000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(29), 4500);
 						break;
 					case 29:
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 295, 10, 4000, 11000, 0, 25, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 400, 295, 10, 4000, 11000, 0, 25, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(30), 9000);
 						break;
 					case 30:
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 1000, 0, 0, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 10000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 250, 90, 25, 0, 1000, 0, 0, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA.getObjectId(), 250, 90, 25, 0, 10000, 0, 0, 1, 0));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(31), 2000);
 						break;
 					case 31:
-						priest.spawnMe();
-						beleth.deleteMe();
-						camera2 = spawn(29121, new Location(14056, 213170, -9357, 0, instanceId));
+						PRIEST.spawnMe();
+						BELETH.deleteMe();
+						CAMERA2 = spawn(29121, new Location(14056, 213170, -9357, 0, instanceId));
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(32), 3500);
 						break;
 					case 32:
-						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
-						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
+						ZONE.broadcastPacket(new SpecialCamera(CAMERA2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
 						L2DoorInstance door2 = DoorTable.getInstance().getDoor(20240002);
 						door2.openMe();
-						_zone.broadcastPacket(new StaticObject(door2, false));
-						_zone.broadcastPacket(new DoorStatusUpdate(door2));
+						ZONE.broadcastPacket(new StaticObject(door2, false));
+						ZONE.broadcastPacket(new DoorStatusUpdate(door2));
 						DoorTable.getInstance().getDoor(20240003).openMe();
 						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(33), 4000);
 						break;
 					case 33:
-						camera.deleteMe();
-						camera2.deleteMe();
-						movie = false;
+						CAMERA.deleteMe();
+						CAMERA2.deleteMe();
+						MOVIE = false;
 						break;
 					case 333:
-						beleth = spawn(29118, new Location(16323, 213170, -9357, 49152));
+						BELETH = spawn(29118, new Location(16323, 213170, -9357, 49152));
 						break;
 				
 				}
@@ -391,7 +387,7 @@ public class Beleth extends L2AttackableAIScript
 	@Override
 	public String onEnterZone(L2Character character, L2ZoneType zone)
 	{
-		if (((character.isPlayer()) && (GrandBossManager.getInstance().getBossStatus(29118) == 1)) || (debug && (GrandBossManager.getInstance().getBossStatus(29118) != 2) && (character.isPlayer())))
+		if (((character.isPlayer()) && (GrandBossManager.getInstance().getBossStatus(29118) == 1)) || (DEBUG && (GrandBossManager.getInstance().getBossStatus(29118) != 2) && (character.isPlayer())))
 		{
 			startSpawnTask();
 			GrandBossManager.getInstance().setBossStatus(29118, 2);
@@ -419,39 +415,39 @@ public class Beleth extends L2AttackableAIScript
 			ThreadPoolManager.getInstance().scheduleGeneral(new unlock(), respawnTime);
 			deleteAll();
 			npc.deleteMe();
-			movie = true;
-			beleth = spawn(29118, new Location(16323, 213170, -9357, 49152));
-			beleth.setIsInvul(true);
-			beleth.setIsImmobilized(true);
-			beleth.disableAllSkills();
-			priest = spawn(29128, new Location(beleth));
-			priest.setShowSummonAnimation(true);
-			priest.decayMe();
+			MOVIE = true;
+			BELETH = spawn(29118, new Location(16323, 213170, -9357, 49152));
+			BELETH.setIsInvul(true);
+			BELETH.setIsImmobilized(true);
+			BELETH.disableAllSkills();
+			PRIEST = spawn(29128, new Location(BELETH));
+			PRIEST.setShowSummonAnimation(true);
+			PRIEST.decayMe();
 			spawn(32470, new Location(12470, 215607, -9381, 49152));
 			ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(27), 1000);
 		}
 		else if (npc.getNpcId() == 29119)
 		{
-			if (npc.getObjectId() == allowObjectId)
+			if (npc.getObjectId() == ALLOW_OBJECT_ID)
 			{
-				minions.remove(npc);
-				killed++;
-				if (killed >= 5)
+				MINIONS.remove(npc);
+				KILLED++;
+				if (KILLED >= 5)
 				{
 					deleteAll();
 					setSpawnTimer(1);
 				}
 				else
 				{
-					allowObjectId = minions.get(getRandom(minions.size())).getObjectId();
-					attacked = false;
+					ALLOW_OBJECT_ID = MINIONS.get(getRandom(MINIONS.size())).getObjectId();
+					ATTACKED = false;
 				}
 			}
-			else if (spawnTimer == null)
+			else if (SPAWN_TIMER == null)
 			{
 				deleteAll();
 				setSpawnTimer(2);
-				killed = 0;
+				KILLED = 0;
 			}
 			npc.abortCast();
 			npc.setTarget(null);
@@ -466,7 +462,7 @@ public class Beleth extends L2AttackableAIScript
 		if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && (skill.getSkillType() == L2SkillType.HEAL) && (getRandom(100) < 80))
 		{
 			npc.setTarget(player);
-			npc.doCast(HornOfRising);
+			npc.doCast(HORN_OF_RISING);
 		}
 		return null;
 	}
@@ -481,15 +477,15 @@ public class Beleth extends L2AttackableAIScript
 		
 		if ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119))
 		{
-			if ((npc.getObjectId() == allowObjectId) && !attacked)
+			if ((npc.getObjectId() == ALLOW_OBJECT_ID) && !ATTACKED)
 			{
-				attacked = true;
-				L2Npc fakeBeleth = minions.get(getRandom(minions.size()));
-				while (fakeBeleth.getObjectId() == allowObjectId)
+				ATTACKED = true;
+				L2Npc fakeBeleth = MINIONS.get(getRandom(MINIONS.size()));
+				while (fakeBeleth.getObjectId() == ALLOW_OBJECT_ID)
 				{
-					fakeBeleth = minions.get(getRandom(minions.size()));
+					fakeBeleth = MINIONS.get(getRandom(MINIONS.size()));
 				}
-				_zone.broadcastPacket(new CreatureSay(fakeBeleth.getObjectId(), 0, fakeBeleth.getName(), "Miss text."));
+				ZONE.broadcastPacket(new CreatureSay(fakeBeleth.getObjectId(), 0, fakeBeleth.getName(), "Miss text."));
 			}
 			if (getRandom(100) < 40)
 			{
@@ -498,25 +494,25 @@ public class Beleth extends L2AttackableAIScript
 			final double distance = Math.sqrt(npc.getPlanDistanceSq(attacker.getX(), attacker.getY()));
 			if ((distance > 500) || (getRandom(100) < 80))
 			{
-				for (L2Npc beleth : minions)
+				for (L2Npc beleth : MINIONS)
 				{
 					if ((beleth != null) && !beleth.isDead() && Util.checkIfInRange(900, beleth, attacker, false) && !beleth.isCastingNow())
 					{
 						beleth.setTarget(attacker);
-						beleth.doCast(Fireball);
+						beleth.doCast(FIREBALL);
 					}
 				}
-				if ((beleth != null) && !beleth.isDead() && Util.checkIfInRange(900, beleth, attacker, false) && !beleth.isCastingNow())
+				if ((BELETH != null) && !BELETH.isDead() && Util.checkIfInRange(900, BELETH, attacker, false) && !BELETH.isCastingNow())
 				{
-					beleth.setTarget(attacker);
-					beleth.doCast(Fireball);
+					BELETH.setTarget(attacker);
+					BELETH.doCast(FIREBALL);
 				}
 			}
 			else if (!npc.isDead() && !npc.isCastingNow())
 			{
 				if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
 				{
-					npc.doCast(Lightening);
+					npc.doCast(LIGHTENING);
 					return null;
 				}
 				((L2Attackable) npc).clearAggroList();
@@ -539,13 +535,13 @@ public class Beleth extends L2AttackableAIScript
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player);
 					int speed = npc.isRunning() ? npc.getRunSpeed() : npc.getWalkSpeed();
 					int time = (int) (((distance2 - 890) / speed) * 1000);
-					ThreadPoolManager.getInstance().scheduleGeneral(new Cast(Fireball, npc), time);
+					ThreadPoolManager.getInstance().scheduleGeneral(new Cast(FIREBALL, npc), time);
 					
 				}
 				else if (distance2 < 890)
 				{
 					npc.setTarget(player);
-					npc.doCast(Fireball);
+					npc.doCast(FIREBALL);
 				}
 				return null;
 			}
@@ -553,14 +549,14 @@ public class Beleth extends L2AttackableAIScript
 			{
 				if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
 				{
-					npc.doCast(Lightening);
+					npc.doCast(LIGHTENING);
 					return null;
 				}
 			}
 			for (L2PcInstance plr : npc.getKnownList().getKnownPlayersInRadius(950))
 			{
 				npc.setTarget(plr);
-				npc.doCast(Fireball);
+				npc.doCast(FIREBALL);
 				return null;
 			}
 			((L2Attackable) npc).clearAggroList();
@@ -571,18 +567,18 @@ public class Beleth extends L2AttackableAIScript
 	@Override
 	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
 	{
-		if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && !movie)
+		if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && !MOVIE)
 		{
 			if (getRandom(100) < 40)
 			{
 				if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
 				{
-					npc.doCast(Bleed);
+					npc.doCast(BLEED);
 					return null;
 				}
 			}
 			npc.setTarget(player);
-			npc.doCast(Fireball);
+			npc.doCast(FIREBALL);
 		}
 		return null;
 	}
@@ -593,9 +589,9 @@ public class Beleth extends L2AttackableAIScript
 		if ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119))
 		{
 			npc.setRunning();
-			if (!movie && !npc.getKnownList().getKnownPlayersInRadius(300).isEmpty() && (getRandom(100) < 60))
+			if (!MOVIE && !npc.getKnownList().getKnownPlayersInRadius(300).isEmpty() && (getRandom(100) < 60))
 			{
-				npc.doCast(Bleed);
+				npc.doCast(BLEED);
 			}
 			if (npc.getNpcId() == 29118)
 			{
@@ -609,7 +605,7 @@ public class Beleth extends L2AttackableAIScript
 	public String onTalk(L2Npc npc, L2PcInstance player)
 	{
 		final String html;
-		if ((belethKiller != null) && (player.getObjectId() == belethKiller.getObjectId()))
+		if ((BELETH_KILLER != null) && (player.getObjectId() == BELETH_KILLER.getObjectId()))
 		{
 			player.addItem("Kill Beleth", 10314, 1, null, true);// giveItems(10314, 1, 0)
 			setBelethKiller(0, player);
@@ -632,7 +628,7 @@ public class Beleth extends L2AttackableAIScript
 	{
 		if (event == 0)
 		{
-			belethKiller = null;
+			BELETH_KILLER = null;
 		}
 		else if (event == 1)
 		{
@@ -640,16 +636,16 @@ public class Beleth extends L2AttackableAIScript
 			{
 				if (killer.getParty().getCommandChannel() != null)
 				{
-					belethKiller = killer.getParty().getCommandChannel().getLeader();
+					BELETH_KILLER = killer.getParty().getCommandChannel().getLeader();
 				}
 				else
 				{
-					belethKiller = killer.getParty().getLeader();
+					BELETH_KILLER = killer.getParty().getLeader();
 				}
 			}
 			else
 			{
-				belethKiller = killer;
+				BELETH_KILLER = killer;
 			}
 		}
 	}
@@ -659,13 +655,13 @@ public class Beleth extends L2AttackableAIScript
 		switch (event)
 		{
 			case 0:
-				spawnTimer = null;
+				SPAWN_TIMER = null;
 				break;
 			case 1:
-				spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(333), 60000);
+				SPAWN_TIMER = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(333), 60000);
 				break;
 			case 2:
-				spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
+				SPAWN_TIMER = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
 				break;
 			default:
 				break;
@@ -674,9 +670,9 @@ public class Beleth extends L2AttackableAIScript
 	
 	private static void deleteAll()
 	{
-		if ((minions != null) && !minions.isEmpty())
+		if ((MINIONS != null) && !MINIONS.isEmpty())
 		{
-			for (L2Npc npc : minions)
+			for (L2Npc npc : MINIONS)
 			{
 				if ((npc == null) || npc.isDead())
 				{
@@ -687,10 +683,10 @@ public class Beleth extends L2AttackableAIScript
 				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 				npc.deleteMe();
 			}
-			minions.clear();
+			MINIONS.clear();
 		}
-		allowObjectId = 0;
-		attacked = false;
+		ALLOW_OBJECT_ID = 0;
+		ATTACKED = false;
 	}
 	
 	protected static void SpawnBeleths()
@@ -703,7 +699,7 @@ public class Beleth extends L2AttackableAIScript
 			int x = (int) ((650 * Math.cos(i * 0.39)) + 16323);
 			int y = (int) ((650 * Math.sin(i * 0.39)) + 213170);
 			npc = spawn(29119, new Location(x, y, -9357, 49152));
-			minions.add(npc);
+			MINIONS.add(npc);
 			if (a >= 2)
 			{
 				npc.setIsOverloaded(true);
@@ -718,58 +714,58 @@ public class Beleth extends L2AttackableAIScript
 			ym[i] = (int) ((1700 * Math.sin((i * 1.57) + 0.78)) + 213170);
 			npc = spawn(29119, new Location(xm[i], ym[i], -9357, 49152));
 			npc.setIsOverloaded(true);
-			minions.add(npc);
+			MINIONS.add(npc);
 		}
 		xm[4] = (xm[0] + xm[1]) / 2;
 		ym[4] = (ym[0] + ym[1]) / 2;
 		npc = spawn(29119, new Location(xm[4], ym[4], -9357, 49152));
 		npc.setIsOverloaded(true);
-		minions.add(npc);
+		MINIONS.add(npc);
 		xm[5] = (xm[1] + xm[2]) / 2;
 		ym[5] = (ym[1] + ym[2]) / 2;
 		npc = spawn(29119, new Location(xm[5], ym[5], -9357, 49152));
 		npc.setIsOverloaded(true);
-		minions.add(npc);
+		MINIONS.add(npc);
 		xm[6] = (xm[2] + xm[3]) / 2;
 		ym[6] = (ym[2] + ym[3]) / 2;
 		npc = spawn(29119, new Location(xm[6], ym[6], -9357, 49152));
 		npc.setIsOverloaded(true);
-		minions.add(npc);
+		MINIONS.add(npc);
 		xm[7] = (xm[3] + xm[0]) / 2;
 		ym[7] = (ym[3] + ym[0]) / 2;
 		npc = spawn(29119, new Location(xm[7], ym[7], -9357, 49152));
 		npc.setIsOverloaded(true);
-		minions.add(npc);
+		MINIONS.add(npc);
 		xm[8] = (xm[0] + xm[4]) / 2;
 		ym[8] = (ym[0] + ym[4]) / 2;
-		minions.add(spawn(29119, new Location(xm[8], ym[8], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[8], ym[8], -9357, 49152)));
 		xm[9] = (xm[4] + xm[1]) / 2;
 		ym[9] = (ym[4] + ym[1]) / 2;
-		minions.add(spawn(29119, new Location(xm[9], ym[9], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[9], ym[9], -9357, 49152)));
 		xm[10] = (xm[1] + xm[5]) / 2;
 		ym[10] = (ym[1] + ym[5]) / 2;
-		minions.add(spawn(29119, new Location(xm[10], ym[10], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[10], ym[10], -9357, 49152)));
 		xm[11] = (xm[5] + xm[2]) / 2;
 		ym[11] = (ym[5] + ym[2]) / 2;
-		minions.add(spawn(29119, new Location(xm[11], ym[11], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[11], ym[11], -9357, 49152)));
 		xm[12] = (xm[2] + xm[6]) / 2;
 		ym[12] = (ym[2] + ym[6]) / 2;
-		minions.add(spawn(29119, new Location(xm[12], ym[12], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[12], ym[12], -9357, 49152)));
 		xm[13] = (xm[6] + xm[3]) / 2;
 		ym[13] = (ym[6] + ym[3]) / 2;
-		minions.add(spawn(29119, new Location(xm[13], ym[13], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[13], ym[13], -9357, 49152)));
 		xm[14] = (xm[3] + xm[7]) / 2;
 		ym[14] = (ym[3] + ym[7]) / 2;
-		minions.add(spawn(29119, new Location(xm[14], ym[14], -9357, 49152)));
+		MINIONS.add(spawn(29119, new Location(xm[14], ym[14], -9357, 49152)));
 		xm[15] = (xm[7] + xm[0]) / 2;
 		ym[15] = (ym[7] + ym[0]) / 2;
-		minions.add(spawn(29119, new Location(xm[15], ym[15], -9357, 49152)));
-		allowObjectId = minions.get(getRandom(minions.size())).getObjectId();
-		attacked = false;
+		MINIONS.add(spawn(29119, new Location(xm[15], ym[15], -9357, 49152)));
+		ALLOW_OBJECT_ID = MINIONS.get(getRandom(MINIONS.size())).getObjectId();
+		ATTACKED = false;
 	}
 	
 	public static void main(String[] args)
 	{
-		new Beleth(-1, "Beleth", "ai");
+		new Beleth(Beleth.class.getSimpleName(), "ai");
 	}
 }

+ 24 - 23
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Core.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.List;
 
 import javolution.util.FastList;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
@@ -35,7 +35,7 @@ import com.l2jserver.gameserver.network.serverpackets.PlaySound;
  * Core AI
  * @author DrLecter Revised By Emperorc
  */
-public class Core extends L2AttackableAIScript
+public class Core extends AbstractNpcAI
 {
 	private static final int CORE = 29006;
 	private static final int DEATH_KNIGHT = 29007;
@@ -52,17 +52,12 @@ public class Core extends L2AttackableAIScript
 	
 	private static boolean _FirstAttacked;
 	
-	private List<L2Attackable> Minions = new FastList<>();
+	private final List<L2Attackable> Minions = new FastList<>();
 	
-	public Core(int id, String name, String descr)
+	private Core(String name, String descr)
 	{
-		super(id, name, descr);
-		
-		int[] mobs =
-		{
-			CORE, DEATH_KNIGHT, DOOM_WRAITH, SUSCEPTOR
-		};
-		registerMobs(mobs);
+		super(name, descr);
+		registerMobs(CORE, DEATH_KNIGHT, DOOM_WRAITH, SUSCEPTOR);
 		
 		_FirstAttacked = false;
 		StatsSet info = GrandBossManager.getInstance().getStatsSet(CORE);
@@ -74,20 +69,24 @@ public class Core extends L2AttackableAIScript
 			// if Core is locked until a certain time, mark it so and start the unlock timer
 			// the unlock time has not yet expired.
 			if (temp > 0)
+			{
 				startQuestTimer("core_unlock", temp, null, null);
+			}
 			else
 			{
 				// the time has already expired while the server was offline. Immediately spawn Core.
 				L2GrandBossInstance core = (L2GrandBossInstance) addSpawn(CORE, 17726, 108915, -6480, 0, false, 0);
 				GrandBossManager.getInstance().setBossStatus(CORE, ALIVE);
-				this.spawnBoss(core);
+				spawnBoss(core);
 			}
 		}
 		else
 		{
 			String test = loadGlobalQuestVar("Core_Attacked");
 			if (test.equalsIgnoreCase("true"))
+			{
 				_FirstAttacked = true;
+			}
 			int loc_x = info.getInteger("loc_x");
 			int loc_y = info.getInteger("loc_y");
 			int loc_z = info.getInteger("loc_z");
@@ -96,15 +95,14 @@ public class Core extends L2AttackableAIScript
 			int mp = info.getInteger("currentMP");
 			L2GrandBossInstance core = (L2GrandBossInstance) addSpawn(CORE, loc_x, loc_y, loc_z, heading, false, 0);
 			core.setCurrentHpMp(hp, mp);
-			this.spawnBoss(core);
+			spawnBoss(core);
 		}
 	}
 	
 	@Override
 	public void saveGlobalData()
 	{
-		String val = "" + _FirstAttacked;
-		saveGlobalQuestVar("Core_Attacked", val);
+		saveGlobalQuestVar("Core_Attacked", Boolean.toString(_FirstAttacked));
 	}
 	
 	public void spawnBoss(L2GrandBossInstance npc)
@@ -115,21 +113,21 @@ public class Core extends L2AttackableAIScript
 		L2Attackable mob;
 		for (int i = 0; i < 5; i++)
 		{
-			int x = 16800 + i * 360;
+			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;
+			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);
 		}
 		for (int i = 0; i < 4; i++)
 		{
-			int x = 16800 + i * 450;
+			int x = 16800 + (i * 450);
 			mob = (L2Attackable) addSpawn(SUSCEPTOR, x, 110300, npc.getZ(), 280 + getRandom(40), false, 0);
 			mob.setIsRaidMinion(true);
 			Minions.add(mob);
@@ -157,7 +155,9 @@ public class Core extends L2AttackableAIScript
 			{
 				L2Attackable mob = Minions.get(i);
 				if (mob != null)
+				{
 					mob.decayMe();
+				}
 			}
 			Minions.clear();
 		}
@@ -172,7 +172,9 @@ public class Core extends L2AttackableAIScript
 			if (_FirstAttacked)
 			{
 				if (getRandom(100) == 0)
+				{
 					npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), NpcStringId.REMOVING_INTRUDERS));
+				}
 			}
 			else
 			{
@@ -204,10 +206,10 @@ public class Core extends L2AttackableAIScript
 			StatsSet info = GrandBossManager.getInstance().getStatsSet(CORE);
 			info.set("respawn_time", (System.currentTimeMillis() + respawnTime));
 			GrandBossManager.getInstance().setStatsSet(CORE, info);
-			this.startQuestTimer("despawn_minions", 20000, null, null);
-			this.cancelQuestTimers("spawn_minion");
+			startQuestTimer("despawn_minions", 20000, null, null);
+			cancelQuestTimers("spawn_minion");
 		}
-		else if (GrandBossManager.getInstance().getBossStatus(CORE) == ALIVE && Minions != null && Minions.contains(npc))
+		else if ((GrandBossManager.getInstance().getBossStatus(CORE) == ALIVE) && (Minions != null) && Minions.contains(npc))
 		{
 			Minions.remove(npc);
 			startQuestTimer("spawn_minion", 60000, npc, null);
@@ -217,7 +219,6 @@ public class Core extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		// now call the constructor (starts up the ai)
-		new Core(-1, "core", "ai");
+		new Core(Core.class.getSimpleName(), "ai");
 	}
 }

+ 37 - 28
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DarkWaterDragon.java

@@ -14,9 +14,12 @@
  */
 package ai.individual;
 
+import java.util.Map;
+import java.util.Set;
+
 import javolution.util.FastMap;
 import javolution.util.FastSet;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcTable;
@@ -25,7 +28,7 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
-public class DarkWaterDragon extends L2AttackableAIScript
+public class DarkWaterDragon extends AbstractNpcAI
 {
 	private static final int DRAGON = 22267;
 	private static final int SHADE1 = 22268;
@@ -33,20 +36,25 @@ public class DarkWaterDragon extends L2AttackableAIScript
 	private static final int FAFURION = 18482;
 	private static final int DETRACTOR1 = 22270;
 	private static final int DETRACTOR2 = 22271;
-	private static FastSet<Integer> secondSpawn = new FastSet<>(); // Used to track if second Shades were already spawned
-	private static FastSet<Integer> myTrackingSet = new FastSet<>(); // Used to track instances of npcs
-	private static FastMap<Integer, L2PcInstance> _idmap = new FastMap<Integer, L2PcInstance>().shared(); // Used to track instances of npcs
+	private static Set<Integer> SECOND_SPAWN = new FastSet<>(); // Used to track if second Shades were already spawned
+	private static Set<Integer> MY_TRACKING_SET = new FastSet<>(); // Used to track instances of npcs
+	private static Map<Integer, L2PcInstance> ID_MAP = new FastMap<Integer, L2PcInstance>().shared(); // Used to track instances of npcs
 	
-	public DarkWaterDragon(int id, String name, String descr)
+	private DarkWaterDragon(String name, String descr)
 	{
-		super(id, name, descr);
+		super(name, descr);
 		int[] mobs =
 		{
-			DRAGON, SHADE1, SHADE2, FAFURION, DETRACTOR1, DETRACTOR2
+			DRAGON,
+			SHADE1,
+			SHADE2,
+			FAFURION,
+			DETRACTOR1,
+			DETRACTOR2
 		};
 		registerMobs(mobs, QuestEventType.ON_KILL, QuestEventType.ON_SPAWN, QuestEventType.ON_ATTACK);
-		myTrackingSet.clear();
-		secondSpawn.clear();
+		MY_TRACKING_SET.clear();
+		SECOND_SPAWN.clear();
 	}
 	
 	@Override
@@ -94,10 +102,12 @@ public class DarkWaterDragon extends L2AttackableAIScript
 				cancelQuestTimer("3", npc, null);
 				cancelQuestTimer("4", npc, null);
 				
-				myTrackingSet.remove(npc.getObjectId());
-				player = _idmap.remove(npc.getObjectId());
-				if (player != null) // You never know ...
+				MY_TRACKING_SET.remove(npc.getObjectId());
+				player = ID_MAP.remove(npc.getObjectId());
+				if (player != null)
+				{
 					((L2Attackable) npc).doItemDrop(NpcTable.getInstance().getTemplate(18485), player);
+				}
 				
 				npc.deleteMe();
 			}
@@ -114,8 +124,8 @@ public class DarkWaterDragon extends L2AttackableAIScript
 					cancelQuestTimer("2", npc, null);
 					cancelQuestTimer("3", npc, null);
 					cancelQuestTimer("4", npc, null);
-					myTrackingSet.remove(npc.getObjectId());
-					_idmap.remove(npc.getObjectId());
+					MY_TRACKING_SET.remove(npc.getObjectId());
+					ID_MAP.remove(npc.getObjectId());
 				}
 				npc.reduceCurrentHp(500, npc, null); // poison kills Fafurion if he is not healed
 			}
@@ -130,9 +140,9 @@ public class DarkWaterDragon extends L2AttackableAIScript
 		int npcObjId = npc.getObjectId();
 		if (npcId == DRAGON)
 		{
-			if (!myTrackingSet.contains(npcObjId)) // this allows to handle multiple instances of npc
+			if (!MY_TRACKING_SET.contains(npcObjId)) // this allows to handle multiple instances of npc
 			{
-				myTrackingSet.add(npcObjId);
+				MY_TRACKING_SET.add(npcObjId);
 				// Spawn first 5 shades on first attack on Dark Water Dragon
 				L2Character originalAttacker = isPet ? attacker.getPet() : attacker;
 				spawnShade(originalAttacker, SHADE1, npc.getX() + 100, npc.getY() + 100, npc.getZ());
@@ -141,9 +151,9 @@ public class DarkWaterDragon extends L2AttackableAIScript
 				spawnShade(originalAttacker, SHADE2, npc.getX() - 100, npc.getY() - 100, npc.getZ());
 				spawnShade(originalAttacker, SHADE1, npc.getX() - 150, npc.getY() + 150, npc.getZ());
 			}
-			else if (npc.getCurrentHp() < (npc.getMaxHp() / 2.0) && !(secondSpawn.contains(npcObjId)))
+			else if ((npc.getCurrentHp() < (npc.getMaxHp() / 2.0)) && !(SECOND_SPAWN.contains(npcObjId)))
 			{
-				secondSpawn.add(npcObjId);
+				SECOND_SPAWN.add(npcObjId);
 				// Spawn second 5 shades on half hp of on Dark Water Dragon
 				L2Character originalAttacker = isPet ? attacker.getPet() : attacker;
 				spawnShade(originalAttacker, SHADE2, npc.getX() + 100, npc.getY() + 100, npc.getZ());
@@ -163,10 +173,10 @@ public class DarkWaterDragon extends L2AttackableAIScript
 		int npcObjId = npc.getObjectId();
 		if (npcId == DRAGON)
 		{
-			myTrackingSet.remove(npcObjId);
-			secondSpawn.remove(npcObjId);
+			MY_TRACKING_SET.remove(npcObjId);
+			SECOND_SPAWN.remove(npcObjId);
 			L2Attackable faf = (L2Attackable) addSpawn(FAFURION, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0); // spawns Fafurion Kindred when Dard Water Dragon is dead
-			_idmap.put(faf.getObjectId(), killer);
+			ID_MAP.put(faf.getObjectId(), killer);
 		}
 		else if (npcId == FAFURION)
 		{
@@ -180,8 +190,8 @@ public class DarkWaterDragon extends L2AttackableAIScript
 			cancelQuestTimer("2", npc, null);
 			cancelQuestTimer("3", npc, null);
 			cancelQuestTimer("4", npc, null);
-			myTrackingSet.remove(npcObjId);
-			_idmap.remove(npcObjId);
+			MY_TRACKING_SET.remove(npcObjId);
+			ID_MAP.remove(npcObjId);
 		}
 		return super.onKill(npc, killer, isPet);
 	}
@@ -193,9 +203,9 @@ public class DarkWaterDragon extends L2AttackableAIScript
 		int npcObjId = npc.getObjectId();
 		if (npcId == FAFURION)
 		{
-			if (!myTrackingSet.contains(npcObjId))
+			if (!MY_TRACKING_SET.contains(npcObjId))
 			{
-				myTrackingSet.add(npcObjId);
+				MY_TRACKING_SET.add(npcObjId);
 				// Spawn 4 Detractors on spawn of Fafurion
 				int x = npc.getX();
 				int y = npc.getY();
@@ -224,7 +234,6 @@ public class DarkWaterDragon extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		// Quest class and state definition
-		new DarkWaterDragon(-1, "DarkWaterDragon", "ai");
+		new DarkWaterDragon(DarkWaterDragon.class.getSimpleName(), "ai");
 	}
 }

+ 17 - 19
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DemonPrince.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.Map;
 
 import javolution.util.FastMap;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -27,7 +27,7 @@ import com.l2jserver.gameserver.model.skills.L2Skill;
 /**
  * @author GKR
  */
-public class DemonPrince extends L2AttackableAIScript
+public class DemonPrince extends AbstractNpcAI
 {
 	private static final int DEMON_PRINCE = 25540;
 	private static final int FIEND = 25541;
@@ -35,17 +35,27 @@ public class DemonPrince extends L2AttackableAIScript
 	private static final SkillHolder UD = new SkillHolder(5044, 2);
 	private static final SkillHolder[] AOE =
 	{
-		new SkillHolder(5376, 4), new SkillHolder(5376, 5), new SkillHolder(5376, 6)
+		new SkillHolder(5376, 4),
+		new SkillHolder(5376, 5),
+		new SkillHolder(5376, 6)
 	};
 	
 	private static final Map<Integer, Boolean> _attackState = new FastMap<>();
 	
+	private DemonPrince(String name, String descr)
+	{
+		super(name, descr);
+		addAttackId(DEMON_PRINCE);
+		addKillId(DEMON_PRINCE);
+		addSpawnId(FIEND);
+	}
+	
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
 		if (event.equalsIgnoreCase("cast") && (npc != null) && (npc.getNpcId() == FIEND) && !npc.isDead())
 		{
-			npc.doCast(AOE[getRandom(3)].getSkill());
+			npc.doCast(AOE[getRandom(AOE.length)].getSkill());
 		}
 		return null;
 	}
@@ -53,7 +63,7 @@ public class DemonPrince extends L2AttackableAIScript
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet, L2Skill skill)
 	{
-		if ((npc.getNpcId() == DEMON_PRINCE) && !npc.isDead())
+		if (!npc.isDead())
 		{
 			if (!_attackState.containsKey(npc.getObjectId()) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.5)))
 			{
@@ -79,10 +89,7 @@ public class DemonPrince extends L2AttackableAIScript
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
-		if (npc.getNpcId() == DEMON_PRINCE)
-		{
-			_attackState.remove(npc.getObjectId());
-		}
+		_attackState.remove(npc.getObjectId());
 		return super.onKill(npc, killer, isPet);
 	}
 	
@@ -113,17 +120,8 @@ public class DemonPrince extends L2AttackableAIScript
 		}
 	}
 	
-	public DemonPrince(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		addAttackId(DEMON_PRINCE);
-		addKillId(DEMON_PRINCE);
-		addSpawnId(FIEND);
-	}
-	
 	public static void main(String[] args)
 	{
-		new DemonPrince(-1, "DemonPrince", "ai");
+		new DemonPrince(DemonPrince.class.getSimpleName(), "ai");
 	}
 }

+ 7 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DrChaos.java

@@ -48,7 +48,7 @@ public class DrChaos extends Quest
 	{
 		for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable())
 		{
-			if (spawn != null && spawn.getNpcid() == npcId)
+			if ((spawn != null) && (spawn.getNpcid() == npcId))
 			{
 				return spawn.getLastSpawn();
 			}
@@ -68,12 +68,16 @@ public class DrChaos extends Quest
 				machine_instance.broadcastPacket(new SpecialCamera(machine_instance.getObjectId(), 1, -200, 15, 10000, 20000, 0, 0, 1, 0));
 			}
 			else
+			{
 				// print "Dr Chaos AI: problem finding Strange Machine (npcid = "+STRANGE_MACHINE+"). Error: not spawned!"
 				startQuestTimer("2", 2000, npc, player);
+			}
 			startQuestTimer("3", 10000, npc, player);
 		}
 		else if (event.equalsIgnoreCase("2"))
+		{
 			npc.broadcastSocialAction(3);
+		}
 		else if (event.equalsIgnoreCase("3"))
 		{
 			npc.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1, -150, 10, 3000, 20000, 0, 0, 1, 0));
@@ -97,7 +101,9 @@ public class DrChaos extends Quest
 			}
 		}
 		else if (event.equalsIgnoreCase("6"))
+		{
 			npc.broadcastPacket(new SpecialCamera(npc.getObjectId(), 30, -200, 20, 6000, 8000, 0, 0, 1, 0));
+		}
 		return super.onAdvEvent(event, npc, player);
 	}
 	

+ 25 - 19
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Epidos.java

@@ -17,35 +17,52 @@ package ai.individual;
 import java.util.Arrays;
 import java.util.Map;
 
-import javolution.util.FastMap;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.util.MinionList;
+import com.l2jserver.util.L2FastMap;
 
 /**
  * Manages minion's spawn, idle despawn and Teleportation Cube spawn.
  * @author GKR
  */
-public class Epidos extends L2AttackableAIScript
+public class Epidos extends AbstractNpcAI
 {
 	private static final int[] EPIDOSES =
 	{
-		25609, 25610, 25611, 25612
+		25609,
+		25610,
+		25611,
+		25612
 	};
+	
 	private static final int[] MINIONS =
 	{
-		25605, 25606, 25607, 25608
+		25605,
+		25606,
+		25607,
+		25608
 	};
+	
 	private static final int[] MINIONS_COUNT =
 	{
-		3, 6, 11
+		3,
+		6,
+		11
 	};
 	
-	private final Map<Integer, Double> _lastHp = new FastMap<>();
+	private final Map<Integer, Double> _lastHp = new L2FastMap<>(true);
+	
+	private Epidos(String name, String descr)
+	{
+		super(name, descr);
+		addKillId(EPIDOSES);
+		addSpawnId(EPIDOSES);
+	}
 	
 	@Override
 	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
@@ -117,19 +134,8 @@ public class Epidos extends L2AttackableAIScript
 		return super.onSpawn(npc);
 	}
 	
-	public Epidos(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		for (int i : EPIDOSES)
-		{
-			addKillId(i);
-			addSpawnId(i);
-		}
-	}
-	
 	public static void main(String[] args)
 	{
-		new Epidos(-1, "Epidos", "ai");
+		new Epidos(Epidos.class.getSimpleName(), "ai");
 	}
 }

+ 21 - 11
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/FleeNpc.java

@@ -14,40 +14,50 @@
  */
 package ai.individual;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
-public class FleeNpc extends L2AttackableAIScript
+public class FleeNpc extends AbstractNpcAI
 {
-	private final int[] _npcId =
+	private static final int[] MOBS =
 	{
-		20432, 22228, 18150, 18151, 18152, 18153, 18154, 18155, 18156, 18157
+		20432,
+		22228,
+		18150,
+		18151,
+		18152,
+		18153,
+		18154,
+		18155,
+		18156,
+		18157
 	};
 	
-	public FleeNpc(int questId, String name, String descr)
+	private FleeNpc(String name, String descr)
 	{
-		super(questId, name, descr);
-		
-		registerMobs(_npcId, QuestEventType.ON_ATTACK);
+		super(name, descr);
+		addAttackId(MOBS);
 	}
 	
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
 	{
-		if (npc.getNpcId() >= 18150 && npc.getNpcId() <= 18157)
+		if ((npc.getNpcId() >= 18150) && (npc.getNpcId() <= 18157))
 		{
 			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition((npc.getX() + getRandom(-40, 40)), (npc.getY() + getRandom(-40, 40)), npc.getZ(), npc.getHeading()));
 			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
 			return null;
 		}
-		else if (npc.getNpcId() == 20432 || npc.getNpcId() == 22228)
+		else if ((npc.getNpcId() == 20432) || (npc.getNpcId() == 22228))
 		{
 			if (getRandom(3) == 2)
+			{
 				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition((npc.getX() + getRandom(-200, 200)), (npc.getY() + getRandom(-200, 200)), npc.getZ(), npc.getHeading()));
+			}
 			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
 			return null;
 		}
@@ -57,6 +67,6 @@ public class FleeNpc extends L2AttackableAIScript
 	// Register the new Script at the Script System
 	public static void main(String[] args)
 	{
-		new FleeNpc(-1, "FleeNpc", "Ai for Flee Npcs");
+		new FleeNpc(FleeNpc.class.getSimpleName(), "ai");
 	}
 }

+ 17 - 13
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/GeneralDilios.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.ArrayList;
 import java.util.List;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.model.L2Spawn;
@@ -31,10 +31,10 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  * Dilios AI
  * @author JIV, Sephiroth, Apocalipce
  */
-public class GeneralDilios extends L2AttackableAIScript
+public class GeneralDilios extends AbstractNpcAI
 {
-	private static final int generalId = 32549;
-	private static final int guardId = 32619;
+	private static final int GENERAL_ID = 32549;
+	private static final int GUARD_ID = 32619;
 	
 	private L2Npc _general;
 	private final List<L2Npc> _guards = new ArrayList<>();
@@ -51,26 +51,28 @@ public class GeneralDilios extends L2AttackableAIScript
 	// NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_EKIMUS_IS_ABOUT_TO_BE_REVIVED_BY_THE_RESURRECTED_UNDEAD_IN_SEED_OF_INFINITY_SEND_ALL_REINFORCEMENTS_TO_THE_HEART_AND_THE_HALL_OF_SUFFERING
 	};
 	
-	public GeneralDilios(int questId, String name, String descr)
+	private GeneralDilios(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		findNpcs();
-		if (_general == null || _guards.isEmpty())
+		if ((_general == null) || _guards.isEmpty())
+		{
 			throw new NullPointerException("Cannot find npcs!");
+		}
 		startQuestTimer("command_0", 60000, null, null);
 	}
 	
-	public void findNpcs()
+	private void findNpcs()
 	{
 		for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable())
 		{
 			if (spawn != null)
 			{
-				if (spawn.getNpcid() == generalId)
+				if (spawn.getNpcid() == GENERAL_ID)
 				{
 					_general = spawn.getLastSpawn();
 				}
-				else if (spawn.getNpcid() == guardId)
+				else if (spawn.getNpcid() == GUARD_ID)
 				{
 					_guards.add(spawn.getLastSpawn());
 				}
@@ -86,13 +88,13 @@ public class GeneralDilios extends L2AttackableAIScript
 			int value = Integer.parseInt(event.substring(8));
 			if (value < 6)
 			{
-				_general.broadcastPacket(new NpcSay(_general.getObjectId(), Say2.NPC_ALL, generalId, NpcStringId.STABBING_THREE_TIMES));
+				_general.broadcastPacket(new NpcSay(_general.getObjectId(), Say2.NPC_ALL, GENERAL_ID, NpcStringId.STABBING_THREE_TIMES));
 				startQuestTimer("guard_animation_0", 3400, null, null);
 			}
 			else
 			{
 				value = -1;
-				_general.broadcastPacket(new NpcSay(_general.getObjectId(), Say2.NPC_SHOUT, generalId, diliosText[getRandom(diliosText.length)]));
+				_general.broadcastPacket(new NpcSay(_general.getObjectId(), Say2.NPC_SHOUT, GENERAL_ID, diliosText[getRandom(diliosText.length)]));
 			}
 			startQuestTimer("command_" + (value + 1), 60000, null, null);
 		}
@@ -104,13 +106,15 @@ public class GeneralDilios extends L2AttackableAIScript
 				guard.broadcastSocialAction(4);
 			}
 			if (value < 2)
+			{
 				startQuestTimer("guard_animation_" + (value + 1), 1500, null, null);
+			}
 		}
 		return super.onAdvEvent(event, npc, player);
 	}
 	
 	public static void main(String[] args)
 	{
-		new GeneralDilios(-1, "GeneralDilios", "ai");
+		new GeneralDilios(GeneralDilios.class.getSimpleName(), "ai");
 	}
 }

+ 54 - 46
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Gordon.java

@@ -16,7 +16,7 @@ package ai.individual;
 
 import java.util.Collection;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SpawnTable;
@@ -30,14 +30,16 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * Gordon AI
  * @author TOFIZ
  */
-public class Gordon extends L2AttackableAIScript
+public class Gordon extends AbstractNpcAI
 {
 	private static final int GORDON = 29095;
-	private static int _npcMoveX = 0;
-	private static int _npcMoveY = 0;
-	private static int _isWalkTo = 0;
-	private static int _npcBlock = 0;
-	private static final L2CharPosition[] WALKS = 
+	
+	private static int NPC_MOVE_X = 0;
+	private static int NPC_MOVE_Y = 0;
+	private static int IS_WALK_TO = 0;
+	private static int NPC_BLOCK = 0;
+	
+	private static final L2CharPosition[] WALKS =
 	{
 		new L2CharPosition(141569, -45908, -2387, 0),
 		new L2CharPosition(142494, -45456, -2397, 0),
@@ -96,12 +98,12 @@ public class Gordon extends L2AttackableAIScript
 		new L2CharPosition(141569, -45908, -2387, 0)
 	};
 	
-	private static boolean _isAttacked = false;
-	private static boolean _isSpawned = false;
+	private static boolean IS_ATTACKED = false;
+	private static boolean IS_SPAWNED = false;
 	
-	public Gordon(int id, String name, String descr)
+	private Gordon(String name, String descr)
 	{
-		super(id, name, descr);
+		super(name, descr);
 		int[] mobs =
 		{
 			GORDON
@@ -110,12 +112,12 @@ public class Gordon extends L2AttackableAIScript
 		// wait 2 minutes after Start AI
 		startQuestTimer("check_ai", 120000, null, null, true);
 		
-		_isSpawned = false;
-		_isAttacked = false;
-		_isWalkTo = 1;
-		_npcMoveX = 0;
-		_npcMoveY = 0;
-		_npcBlock = 0;
+		IS_SPAWNED = false;
+		IS_ATTACKED = false;
+		IS_WALK_TO = 1;
+		NPC_MOVE_X = 0;
+		NPC_MOVE_Y = 0;
+		NPC_BLOCK = 0;
 	}
 	
 	public L2Npc findTemplate(int npcId)
@@ -123,7 +125,7 @@ public class Gordon extends L2AttackableAIScript
 		L2Npc npc = null;
 		for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable())
 		{
-			if (spawn != null && spawn.getNpcid() == npcId)
+			if ((spawn != null) && (spawn.getNpcid() == npcId))
 			{
 				npc = spawn.getLastSpawn();
 				break;
@@ -135,10 +137,10 @@ public class Gordon extends L2AttackableAIScript
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
-		L2CharPosition loc = WALKS[_isWalkTo - 1];
+		L2CharPosition loc = WALKS[IS_WALK_TO - 1];
 		if (event.equalsIgnoreCase("time_isAttacked"))
 		{
-			_isAttacked = false;
+			IS_ATTACKED = false;
 			if (npc.getNpcId() == GORDON)
 			{
 				npc.setWalking();
@@ -148,13 +150,13 @@ public class Gordon extends L2AttackableAIScript
 		else if (event.equalsIgnoreCase("check_ai"))
 		{
 			cancelQuestTimer("check_ai", null, null);
-			if (_isSpawned == false)
+			if (IS_SPAWNED == false)
 			{
 				final L2Npc gordon = findTemplate(GORDON);
 				if (gordon != null)
 				{
-					_isSpawned = true;
-					((L2Attackable)gordon).setCanReturnToSpawnPoint(false);
+					IS_SPAWNED = true;
+					((L2Attackable) gordon).setCanReturnToSpawnPoint(false);
 					startQuestTimer("Start", 1000, gordon, null, true);
 					return super.onAdvEvent(event, npc, player);
 				}
@@ -162,13 +164,13 @@ public class Gordon extends L2AttackableAIScript
 		}
 		else if (event.equalsIgnoreCase("Start"))
 		{
-			if (npc != null && _isSpawned == true)
+			if ((npc != null) && (IS_SPAWNED == true))
 			{
 				// check if player have Cursed Weapon and in radius
 				if (npc.getNpcId() == GORDON)
 				{
 					Collection<L2PcInstance> chars = npc.getKnownList().getKnownPlayers().values();
-					if (chars != null && chars.size() > 0)
+					if ((chars != null) && (chars.size() > 0))
 					{
 						for (L2PcInstance pc : chars)
 						{
@@ -177,7 +179,7 @@ public class Gordon extends L2AttackableAIScript
 								npc.setRunning();
 								((L2Attackable) npc).addDamageHate(pc, 0, 9999);
 								npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, pc);
-								_isAttacked = true;
+								IS_ATTACKED = true;
 								cancelQuestTimer("time_isAttacked", null, null);
 								startQuestTimer("time_isAttacked", 180000, npc, null);
 								return super.onAdvEvent(event, npc, player);
@@ -186,35 +188,41 @@ public class Gordon extends L2AttackableAIScript
 					}
 				}
 				// end check
-				if (_isAttacked == true)
+				if (IS_ATTACKED == true)
+				{
 					return super.onAdvEvent(event, npc, player);
-				if (npc.getNpcId() == GORDON && (npc.getX() - 50) <= loc.x && (npc.getX() + 50) >= loc.y && (npc.getY() - 50) <= loc.y && (npc.getY() + 50) >= loc.y)
+				}
+				if ((npc.getNpcId() == GORDON) && ((npc.getX() - 50) <= loc.x) && ((npc.getX() + 50) >= loc.y) && ((npc.getY() - 50) <= loc.y) && ((npc.getY() + 50) >= loc.y))
 				{
-					_isWalkTo++;
-					if (_isWalkTo > 55)
-						_isWalkTo = 1;
-					loc = WALKS[_isWalkTo - 1];
+					IS_WALK_TO++;
+					if (IS_WALK_TO > 55)
+					{
+						IS_WALK_TO = 1;
+					}
+					loc = WALKS[IS_WALK_TO - 1];
 					npc.setWalking();
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, loc);
 				}
 				
 				// Test for unblock Npc
-				if (npc.getX() != _npcMoveX && npc.getY() != _npcMoveY)
+				if ((npc.getX() != NPC_MOVE_X) && (npc.getY() != NPC_MOVE_Y))
 				{
-					_npcMoveX = npc.getX();
-					_npcMoveY = npc.getY();
-					_npcBlock = 0;
+					NPC_MOVE_X = npc.getX();
+					NPC_MOVE_Y = npc.getY();
+					NPC_BLOCK = 0;
 				}
 				else if (npc.getNpcId() == GORDON)
 				{
-					_npcBlock++;
-					if (_npcBlock > 2)
+					NPC_BLOCK++;
+					if (NPC_BLOCK > 2)
 					{
 						npc.teleToLocation(loc.x, loc.y, loc.z);
 						return super.onAdvEvent(event, npc, player);
 					}
-					if (_npcBlock > 0)
+					if (NPC_BLOCK > 0)
+					{
 						npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, loc);
+					}
 				}
 				// End Test unblock Npc
 			}
@@ -225,11 +233,11 @@ public class Gordon extends L2AttackableAIScript
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (npc.getNpcId() == GORDON && _npcBlock == 0)
+		if ((npc.getNpcId() == GORDON) && (NPC_BLOCK == 0))
 		{
-			_isSpawned = true;
-			_isWalkTo = 1;
-			((L2Attackable)npc).setCanReturnToSpawnPoint(false);
+			IS_SPAWNED = true;
+			IS_WALK_TO = 1;
+			((L2Attackable) npc).setCanReturnToSpawnPoint(false);
 			startQuestTimer("Start", 1000, npc, null, true);
 		}
 		return super.onSpawn(npc);
@@ -240,7 +248,7 @@ public class Gordon extends L2AttackableAIScript
 	{
 		if (npc.getNpcId() == GORDON)
 		{
-			_isAttacked = true;
+			IS_ATTACKED = true;
 			cancelQuestTimer("time_isAttacked", null, null);
 			startQuestTimer("time_isAttacked", 180000, npc, null);
 			if (player != null)
@@ -260,13 +268,13 @@ public class Gordon extends L2AttackableAIScript
 		{
 			cancelQuestTimer("Start", null, null);
 			cancelQuestTimer("time_isAttacked", null, null);
-			_isSpawned = false;
+			IS_SPAWNED = false;
 		}
 		return super.onKill(npc, killer, isPet);
 	}
 	
 	public static void main(String[] args)
 	{
-		new Gordon(-1, Gordon.class.getSimpleName(), "ai");
+		new Gordon(Gordon.class.getSimpleName(), "ai");
 	}
 }

+ 11 - 11
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/HellboundCore.java

@@ -14,25 +14,32 @@
  */
 package ai.individual;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.instancemanager.HellboundManager;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
-import com.l2jserver.gameserver.model.quest.Quest;
 
 /**
  * Manages Naia's cast on the Hellbound Core
  * @author GKR
  */
-public class HellboundCore extends Quest
+public class HellboundCore extends AbstractNpcAI
 {
 	private static final int NAIA = 18484;
 	private static final int HELLBOUND_CORE = 32331;
 	
 	private static SkillHolder BEAM = new SkillHolder(5493, 1);
 	
+	private HellboundCore(String name, String descr)
+	{
+		super(name, descr);
+		addSpawnId(HELLBOUND_CORE);
+	}
+	
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
@@ -40,7 +47,7 @@ public class HellboundCore extends Quest
 		{
 			for (L2Character naia : npc.getKnownList().getKnownCharactersInRadius(900))
 			{
-				if (naia != null && naia.isMonster() && ((L2MonsterInstance) naia).getNpcId() == NAIA && !naia.isDead())
+				if ((naia != null) && naia.isMonster() && (((L2MonsterInstance) naia).getNpcId() == NAIA) && !naia.isDead())
 				{
 					naia.setTarget(npc);
 					naia.doSimultaneousCast(BEAM.getSkill());
@@ -58,15 +65,8 @@ public class HellboundCore extends Quest
 		return super.onSpawn(npc);
 	}
 	
-	public HellboundCore(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		addSpawnId(HELLBOUND_CORE);
-	}
-	
 	public static void main(String[] args)
 	{
-		new HellboundCore(-1, "HellboundCore", "ai");
+		new HellboundCore(HellboundCore.class.getSimpleName(), "ai");
 	}
 }

+ 26 - 26
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Keltas.java

@@ -17,13 +17,13 @@ package ai.individual;
 import java.util.List;
 
 import javolution.util.FastList;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
 import com.l2jserver.gameserver.network.serverpackets.NpcSay;
@@ -32,15 +32,15 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  * Manages Darion's Enforcer's and Darion's Executioner spawn/despawn
  * @author GKR
  */
-public class Keltas extends Quest
+public class Keltas extends AbstractNpcAI
 {
 	private static final int KELTAS = 22341;
 	private static final int ENFORCER = 22342;
 	private static final int EXECUTIONER = 22343;
 	
-	private L2MonsterInstance spawnedKeltas = null;
+	private L2MonsterInstance _spawnedKeltas = null;
 	
-	private final List<L2Spawn> spawnedMonsters;
+	private final List<L2Spawn> _spawnedMonsters;
 	
 	private static final Location[] ENFORCER_SPAWN_POINTS =
 	{
@@ -101,6 +101,16 @@ public class Keltas extends Quest
 		new Location(-28492, 250704, -3523)
 	};
 	
+	public Keltas(String name, String descr)
+	{
+		super(name, descr);
+		
+		addKillId(KELTAS);
+		addSpawnId(KELTAS);
+		
+		_spawnedMonsters = new FastList<>();
+	}
+	
 	private void spawnMinions()
 	{
 		for (Location loc : ENFORCER_SPAWN_POINTS)
@@ -109,7 +119,7 @@ public class Keltas extends Quest
 			minion.getSpawn().setRespawnDelay(60);
 			minion.getSpawn().setAmount(1);
 			minion.getSpawn().startRespawn();
-			spawnedMonsters.add(minion.getSpawn());
+			_spawnedMonsters.add(minion.getSpawn());
 		}
 		
 		for (Location loc : EXECUTIONER_SPAWN_POINTS)
@@ -118,18 +128,18 @@ public class Keltas extends Quest
 			minion.getSpawn().setRespawnDelay(80);
 			minion.getSpawn().setAmount(1);
 			minion.getSpawn().startRespawn();
-			spawnedMonsters.add(minion.getSpawn());
+			_spawnedMonsters.add(minion.getSpawn());
 		}
 	}
 	
 	private void despawnMinions()
 	{
-		if ((spawnedMonsters == null) || spawnedMonsters.isEmpty())
+		if ((_spawnedMonsters == null) || _spawnedMonsters.isEmpty())
 		{
 			return;
 		}
 		
-		for (L2Spawn spawn : spawnedMonsters)
+		for (L2Spawn spawn : _spawnedMonsters)
 		{
 			spawn.stopRespawn();
 			L2Npc minion = spawn.getLastSpawn();
@@ -138,7 +148,7 @@ public class Keltas extends Quest
 				minion.deleteMe();
 			}
 		}
-		spawnedMonsters.clear();
+		_spawnedMonsters.clear();
 	}
 	
 	@Override
@@ -146,11 +156,11 @@ public class Keltas extends Quest
 	{
 		if (event.equalsIgnoreCase("despawn"))
 		{
-			if ((spawnedKeltas != null) && !spawnedKeltas.isDead())
+			if ((_spawnedKeltas != null) && !_spawnedKeltas.isDead())
 			{
-				spawnedKeltas.broadcastPacket(new NpcSay(spawnedKeltas.getObjectId(), Say2.NPC_SHOUT, spawnedKeltas.getNpcId(), NpcStringId.THAT_IS_IT_FOR_TODAYLETS_RETREAT_EVERYONE_PULL_BACK));
-				spawnedKeltas.deleteMe();
-				spawnedKeltas.getSpawn().decreaseCount(spawnedKeltas);
+				_spawnedKeltas.broadcastPacket(new NpcSay(_spawnedKeltas.getObjectId(), Say2.NPC_SHOUT, _spawnedKeltas.getNpcId(), NpcStringId.THAT_IS_IT_FOR_TODAYLETS_RETREAT_EVERYONE_PULL_BACK));
+				_spawnedKeltas.deleteMe();
+				_spawnedKeltas.getSpawn().decreaseCount(_spawnedKeltas);
 				despawnMinions();
 			}
 		}
@@ -171,26 +181,16 @@ public class Keltas extends Quest
 	{
 		if (!npc.isTeleporting())
 		{
-			spawnedKeltas = (L2MonsterInstance) npc;
-			npc.broadcastPacket(new NpcSay(spawnedKeltas.getObjectId(), Say2.NPC_SHOUT, spawnedKeltas.getNpcId(), NpcStringId.GUYS_SHOW_THEM_OUR_POWER));
+			_spawnedKeltas = (L2MonsterInstance) npc;
+			npc.broadcastPacket(new NpcSay(_spawnedKeltas.getObjectId(), Say2.NPC_SHOUT, _spawnedKeltas.getNpcId(), NpcStringId.GUYS_SHOW_THEM_OUR_POWER));
 			spawnMinions();
 			startQuestTimer("despawn", 1800000, null, null);
 		}
 		return super.onSpawn(npc);
 	}
 	
-	public Keltas(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		addKillId(KELTAS);
-		addSpawnId(KELTAS);
-		
-		spawnedMonsters = new FastList<>();
-	}
-	
 	public static void main(String[] args)
 	{
-		new Keltas(-1, "keltas", "ai");
+		new Keltas(Keltas.class.getSimpleName(), "ai");
 	}
 }

+ 9 - 9
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/NaiaLock.java

@@ -14,7 +14,7 @@
  */
 package ai.individual;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
@@ -24,10 +24,16 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  * Removes minions after master's death
  * @author GKR
  */
-public class NaiaLock extends L2AttackableAIScript
+public class NaiaLock extends AbstractNpcAI
 {
 	private static final int LOCK = 18491;
 	
+	public NaiaLock(String name, String descr)
+	{
+		super(name, descr);
+		addKillId(LOCK);
+	}
+	
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
@@ -35,14 +41,8 @@ public class NaiaLock extends L2AttackableAIScript
 		return super.onKill(npc, killer, isPet);
 	}
 	
-	public NaiaLock(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		addKillId(LOCK);
-	}
-	
 	public static void main(String[] args)
 	{
-		new NaiaLock(-1, "NaiaLock", "ai");
+		new NaiaLock(NaiaLock.class.getSimpleName(), "ai");
 	}
 }

+ 42 - 31
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Orfen.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.List;
 
 import javolution.util.FastList;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
@@ -43,10 +43,10 @@ import com.l2jserver.gameserver.network.serverpackets.PlaySound;
  * Orfen AI
  * @author Emperorc
  */
-public class Orfen extends L2AttackableAIScript
+public class Orfen extends AbstractNpcAI
 {
 	//@formatter:off
-	private static final Location[] Pos =
+	private static final Location[] POS =
 	{
 		new Location(43728, 17220, -4342), 
 		new Location(55024, 17368, -5412),
@@ -54,7 +54,7 @@ public class Orfen extends L2AttackableAIScript
 		new Location(53248, 24576, -5262)
 	};
 	
-	private static final NpcStringId[] Text =
+	private static final NpcStringId[] TEXT =
 	{
 		NpcStringId.S1_STOP_KIDDING_YOURSELF_ABOUT_YOUR_OWN_POWERLESSNESS,
 		NpcStringId.S1_ILL_MAKE_YOU_FEEL_WHAT_TRUE_FEAR_IS, 
@@ -71,21 +71,23 @@ public class Orfen extends L2AttackableAIScript
 	
 	private static boolean _IsTeleported;
 	private static List<L2Attackable> _Minions = new FastList<>();
-	private static L2BossZone _Zone;
+	private static L2BossZone ZONE;
 	
 	private static final byte ALIVE = 0;
 	private static final byte DEAD = 1;
 	
-	public Orfen(int id, String name, String descr)
+	private Orfen(String name, String descr)
 	{
-		super(id, name, descr);
+		super(name, descr);
 		int[] mobs =
 		{
-			ORFEN, RAIKEL_LEOS, RIBA_IREN
+			ORFEN,
+			RAIKEL_LEOS,
+			RIBA_IREN
 		};
 		registerMobs(mobs);
 		_IsTeleported = false;
-		_Zone = GrandBossManager.getInstance().getZone(Pos[0]);
+		ZONE = GrandBossManager.getInstance().getZone(POS[0]);
 		StatsSet info = GrandBossManager.getInstance().getStatsSet(ORFEN);
 		int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
 		if (status == DEAD)
@@ -95,7 +97,9 @@ public class Orfen extends L2AttackableAIScript
 			// if Orfen is locked until a certain time, mark it so and start the unlock timer
 			// the unlock time has not yet expired.
 			if (temp > 0)
+			{
 				startQuestTimer("orfen_unlock", temp, null, null);
+			}
 			else
 			{
 				// the time has already expired while the server was offline. Immediately spawn Orfen.
@@ -103,15 +107,15 @@ public class Orfen extends L2AttackableAIScript
 				Location loc;
 				if (i < 4)
 				{
-					loc = Pos[1];
+					loc = POS[1];
 				}
 				else if (i < 7)
 				{
-					loc = Pos[2];
+					loc = POS[2];
 				}
 				else
 				{
-					loc = Pos[3];
+					loc = POS[3];
 				}
 				L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc, false, 0);
 				GrandBossManager.getInstance().setBossStatus(ORFEN, ALIVE);
@@ -137,8 +141,8 @@ public class Orfen extends L2AttackableAIScript
 		((L2Attackable) npc).clearAggroList();
 		npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
 		L2Spawn spawn = npc.getSpawn();
-		spawn.setLocation(Pos[index]);
-		npc.teleToLocation(Pos[index], false);
+		spawn.setLocation(POS[index]);
+		npc.teleToLocation(POS[index], false);
 	}
 	
 	public void spawnBoss(L2GrandBossInstance npc)
@@ -174,15 +178,15 @@ public class Orfen extends L2AttackableAIScript
 			Location loc;
 			if (i < 4)
 			{
-				loc = Pos[1];
+				loc = POS[1];
 			}
 			else if (i < 7)
 			{
-				loc = Pos[2];
+				loc = POS[2];
 			}
 			else
 			{
-				loc = Pos[3];
+				loc = POS[3];
 			}
 			L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc, false, 0);
 			GrandBossManager.getInstance().setBossStatus(ORFEN, ALIVE);
@@ -190,13 +194,15 @@ public class Orfen extends L2AttackableAIScript
 		}
 		else if (event.equalsIgnoreCase("check_orfen_pos"))
 		{
-			if ((_IsTeleported && npc.getCurrentHp() > npc.getMaxHp() * 0.95) || (!_Zone.isInsideZone(npc) && !_IsTeleported))
+			if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported))
 			{
 				setSpawnPoint(npc, getRandom(3) + 1);
 				_IsTeleported = false;
 			}
-			else if (_IsTeleported && !_Zone.isInsideZone(npc))
+			else if (_IsTeleported && !ZONE.isInsideZone(npc))
+			{
 				setSpawnPoint(npc, 0);
+			}
 		}
 		else if (event.equalsIgnoreCase("check_minion_loc"))
 		{
@@ -217,7 +223,9 @@ public class Orfen extends L2AttackableAIScript
 			{
 				L2Attackable mob = _Minions.get(i);
 				if (mob != null)
+				{
 					mob.decayMe();
+				}
 			}
 			_Minions.clear();
 		}
@@ -236,9 +244,9 @@ public class Orfen extends L2AttackableAIScript
 		if (npc.getNpcId() == ORFEN)
 		{
 			L2Character originalCaster = isPet ? caster.getPet() : caster;
-			if (skill.getAggroPoints() > 0 && getRandom(5) == 0 && npc.isInsideRadius(originalCaster, 1000, false, false))
+			if ((skill.getAggroPoints() > 0) && (getRandom(5) == 0) && npc.isInsideRadius(originalCaster, 1000, false, false))
 			{
-				NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), Text[getRandom(4)]);
+				NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getNpcId(), TEXT[getRandom(4)]);
 				packet.addStringParameter(caster.getName().toString());
 				npc.broadcastPacket(packet);
 				originalCaster.teleToLocation(npc.getX(), npc.getY(), npc.getZ());
@@ -252,11 +260,13 @@ public class Orfen extends L2AttackableAIScript
 	@Override
 	public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isPet)
 	{
-		if (caller == null || npc == null || npc.isCastingNow())
+		if ((caller == null) || (npc == null) || npc.isCastingNow())
+		{
 			return super.onFactionCall(npc, caller, attacker, isPet);
+		}
 		int npcId = npc.getNpcId();
 		int callerId = caller.getNpcId();
-		if (npcId == RAIKEL_LEOS && getRandom(20) == 0)
+		if ((npcId == RAIKEL_LEOS) && (getRandom(20) == 0))
 		{
 			npc.setTarget(attacker);
 			npc.doCast(SkillTable.getInstance().getInfo(4067, 4));
@@ -265,8 +275,10 @@ public class Orfen extends L2AttackableAIScript
 		{
 			int chance = 1;
 			if (callerId == ORFEN)
+			{
 				chance = 9;
-			if (callerId != RIBA_IREN && caller.getCurrentHp() < (caller.getMaxHp() / 2.0) && getRandom(10) < chance)
+			}
+			if ((callerId != RIBA_IREN) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance))
 			{
 				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
 				npc.setTarget(caller);
@@ -282,14 +294,14 @@ public class Orfen extends L2AttackableAIScript
 		int npcId = npc.getNpcId();
 		if (npcId == ORFEN)
 		{
-			if (!_IsTeleported && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))
+			if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
 			{
 				_IsTeleported = true;
 				setSpawnPoint(npc, 0);
 			}
-			else if (npc.isInsideRadius(attacker, 1000, false, false) && !npc.isInsideRadius(attacker, 300, false, false) && getRandom(10) == 0)
+			else if (npc.isInsideRadius(attacker, 1000, false, false) && !npc.isInsideRadius(attacker, 300, false, false) && (getRandom(10) == 0))
 			{
-				NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npcId, Text[getRandom(3)]);
+				NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npcId, TEXT[getRandom(3)]);
 				packet.addStringParameter(attacker.getName().toString());
 				npc.broadcastPacket(packet);
 				attacker.teleToLocation(npc.getX(), npc.getY(), npc.getZ());
@@ -299,7 +311,7 @@ public class Orfen extends L2AttackableAIScript
 		}
 		else if (npcId == RIBA_IREN)
 		{
-			if (!npc.isCastingNow() && (npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0))
+			if (!npc.isCastingNow() && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0)))
 			{
 				npc.setTarget(attacker);
 				npc.doCast(SkillTable.getInstance().getInfo(4516, 1));
@@ -327,7 +339,7 @@ public class Orfen extends L2AttackableAIScript
 			startQuestTimer("despawn_minions", 20000, null, null);
 			cancelQuestTimers("spawn_minion");
 		}
-		else if (GrandBossManager.getInstance().getBossStatus(ORFEN) == ALIVE && npc.getNpcId() == RAIKEL_LEOS)
+		else if ((GrandBossManager.getInstance().getBossStatus(ORFEN) == ALIVE) && (npc.getNpcId() == RAIKEL_LEOS))
 		{
 			_Minions.remove(npc);
 			startQuestTimer("spawn_minion", 360000, npc, null);
@@ -337,7 +349,6 @@ public class Orfen extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		// Quest class and state definition
-		new Orfen(-1, "orfen", "ai");
+		new Orfen(Orfen.class.getSimpleName(), "ai");
 	}
 }

+ 16 - 17
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/OutpostCaptain.java

@@ -14,25 +14,37 @@
  */
 package ai.individual;
 
+import ai.npc.AbstractNpcAI;
+
 import com.l2jserver.gameserver.datatables.DoorTable;
 import com.l2jserver.gameserver.instancemanager.HellboundManager;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.quest.Quest;
 
 /**
  * @author DS
  */
-public class OutpostCaptain extends Quest
+public class OutpostCaptain extends AbstractNpcAI
 {
 	private static final int CAPTAIN = 18466;
+	
 	private static final int[] DEFENDERS =
 	{
-		22357, 22358
+		22357,
+		22358
 	};
+	
 	private static final int DOORKEEPER = 32351;
 	
+	private OutpostCaptain(String name, String descr)
+	{
+		super(name, descr);
+		addKillId(CAPTAIN);
+		addSpawnId(CAPTAIN, DOORKEEPER);
+		addSpawnId(DEFENDERS);
+	}
+	
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
@@ -76,21 +88,8 @@ public class OutpostCaptain extends Quest
 		return super.onSpawn(npc);
 	}
 	
-	public OutpostCaptain(int questId, String name, String descr)
-	{
-		super(questId, name, descr);
-		addKillId(CAPTAIN);
-		addSpawnId(CAPTAIN);
-		addSpawnId(DOORKEEPER);
-		
-		for (int i : DEFENDERS)
-		{
-			addSpawnId(i);
-		}
-	}
-	
 	public static void main(String[] args)
 	{
-		new OutpostCaptain(-1, OutpostCaptain.class.getSimpleName(), "ai");
+		new OutpostCaptain(OutpostCaptain.class.getSimpleName(), "ai");
 	}
 }

+ 5 - 7
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/QueenAnt.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.List;
 
 import javolution.util.FastList;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
@@ -41,9 +41,8 @@ import com.l2jserver.util.Rnd;
  * Queen Ant AI
  * @author Emperorc
  */
-public class QueenAnt extends L2AttackableAIScript
+public class QueenAnt extends AbstractNpcAI
 {
-	
 	private static final int QUEEN = 29001;
 	private static final int LARVA = 29002;
 	private static final int NURSE = 29003;
@@ -76,9 +75,9 @@ public class QueenAnt extends L2AttackableAIScript
 	private L2MonsterInstance _larva = null;
 	private final List<L2MonsterInstance> _nurses = new FastList<>(5);
 	
-	public QueenAnt(int questId, String name, String descr)
+	private QueenAnt(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		
 		registerMobs(MOBS, QuestEventType.ON_SPAWN, QuestEventType.ON_KILL, QuestEventType.ON_AGGRO_RANGE_ENTER);
 		addFactionCallId(NURSE);
@@ -365,7 +364,6 @@ public class QueenAnt extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		// now call the constructor (starts up the ai)
-		new QueenAnt(-1, "queen_ant", "ai");
+		new QueenAnt(QueenAnt.class.getSimpleName(), "ai");
 	}
 }

+ 19 - 30
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Ranku.java

@@ -14,10 +14,10 @@
  */
 package ai.individual;
 
-import java.util.HashSet;
 import java.util.Set;
 
-import ai.group_template.L2AttackableAIScript;
+import javolution.util.FastSet;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
@@ -32,13 +32,20 @@ import com.l2jserver.gameserver.util.MinionList;
  * Ranku's AI.
  * @author GKR
  */
-public class Ranku extends L2AttackableAIScript
+public class Ranku extends AbstractNpcAI
 {
 	private static final int RANKU = 25542;
 	private static final int MINION = 32305;
 	private static final int MINION_2 = 25543;
 	
-	private static Set<Integer> myTrackingSet = new HashSet<>();
+	private static final Set<Integer> MY_TRACKING_SET = new FastSet<Integer>().shared();
+	
+	private Ranku(String name, String descr)
+	{
+		super(name, descr);
+		addAttackId(RANKU);
+		addKillId(RANKU, MINION);
+	}
 	
 	@Override
 	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
@@ -47,7 +54,7 @@ public class Ranku extends L2AttackableAIScript
 		{
 			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
 			{
-				if ((minion != null) && !minion.isDead() && myTrackingSet.contains(minion.getObjectId()))
+				if ((minion != null) && !minion.isDead() && MY_TRACKING_SET.contains(minion.getObjectId()))
 				{
 					L2PcInstance[] players = minion.getKnownList().getKnownPlayers().values().toArray(new L2PcInstance[minion.getKnownList().getKnownPlayers().size()]);
 					L2PcInstance killer = players[getRandom(players.length)];
@@ -66,14 +73,11 @@ public class Ranku extends L2AttackableAIScript
 		{
 			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
 			{
-				if ((minion != null) && !minion.isDead() && !myTrackingSet.contains(minion.getObjectId()))
+				if ((minion != null) && !minion.isDead() && !MY_TRACKING_SET.contains(minion.getObjectId()))
 				{
 					minion.broadcastPacket(new NpcSay(minion.getObjectId(), Say2.NPC_ALL, minion.getNpcId(), NpcStringId.DONT_KILL_ME_PLEASE_SOMETHINGS_STRANGLING_ME));
 					startQuestTimer("checkup", 1000, npc, null);
-					synchronized (myTrackingSet)
-					{
-						myTrackingSet.add(minion.getObjectId());
-					}
+					MY_TRACKING_SET.add(minion.getObjectId());
 				}
 			}
 		}
@@ -85,12 +89,9 @@ public class Ranku extends L2AttackableAIScript
 	{
 		if (npc.getNpcId() == MINION)
 		{
-			if (myTrackingSet.contains(npc.getObjectId()))
+			if (MY_TRACKING_SET.contains(npc.getObjectId()))
 			{
-				synchronized (myTrackingSet)
-				{
-					myTrackingSet.remove(npc.getObjectId());
-				}
+				MY_TRACKING_SET.remove(npc.getObjectId());
 			}
 			
 			final L2MonsterInstance master = ((L2MonsterInstance) npc).getLeader();
@@ -104,29 +105,17 @@ public class Ranku extends L2AttackableAIScript
 		{
 			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
 			{
-				if (myTrackingSet.contains(minion.getObjectId()))
+				if (MY_TRACKING_SET.contains(minion.getObjectId()))
 				{
-					synchronized (myTrackingSet)
-					{
-						myTrackingSet.remove(minion.getObjectId());
-					}
+					MY_TRACKING_SET.remove(minion.getObjectId());
 				}
 			}
 		}
 		return super.onKill(npc, killer, isPet);
 	}
 	
-	public Ranku(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		addAttackId(RANKU);
-		addKillId(RANKU);
-		addKillId(MINION);
-	}
-	
 	public static void main(String[] args)
 	{
-		new Ranku(-1, "Ranku", "ai");
+		new Ranku(Ranku.class.getSimpleName(), "ai");
 	}
 }

+ 23 - 14
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinWardens.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.Map;
 
 import javolution.util.FastMap;
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
@@ -30,15 +30,34 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  * Manages Sin Wardens disappearing and chat
  * @author GKR
  */
-public class SinWardens extends L2AttackableAIScript
+public class SinWardens extends AbstractNpcAI
 {
 	private static final int[] SIN_WARDEN_MINIONS =
 	{
-		22424, 22425, 22426, 22427, 22428, 22429, 22430, 22432, 22433, 22434, 22435, 22436, 22437, 22438
+		22424,
+		22425,
+		22426,
+		22427,
+		22428,
+		22429,
+		22430,
+		22432,
+		22433,
+		22434,
+		22435,
+		22436,
+		22437,
+		22438
 	};
 	
 	private final Map<Integer, Integer> killedMinionsCount = new FastMap<>();
 	
+	private SinWardens(String name, String descr)
+	{
+		super(name, descr);
+		addKillId(SIN_WARDEN_MINIONS);
+	}
+	
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
 	{
@@ -65,18 +84,8 @@ public class SinWardens extends L2AttackableAIScript
 		return super.onKill(npc, killer, isPet);
 	}
 	
-	public SinWardens(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		for (int monsterId : SIN_WARDEN_MINIONS)
-		{
-			addKillId(monsterId);
-		}
-	}
-	
 	public static void main(String[] args)
 	{
-		new SinWardens(-1, "SinWardens", "ai");
+		new SinWardens(SinWardens.class.getSimpleName(), "ai");
 	}
 }

+ 17 - 17
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Typhoon.java

@@ -14,7 +14,7 @@
  */
 package ai.individual;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -25,12 +25,26 @@ import com.l2jserver.gameserver.model.holders.SkillHolder;
 /**
  * @author GKR
  */
-public class Typhoon extends L2AttackableAIScript
+public class Typhoon extends AbstractNpcAI
 {
 	private static final int TYPHOON = 25539;
 	
 	private static SkillHolder STORM = new SkillHolder(5434, 1);
 	
+	private Typhoon(String name, String descr)
+	{
+		super(name, descr);
+		
+		addAggroRangeEnterId(TYPHOON);
+		addSpawnId(TYPHOON);
+		
+		final L2RaidBossInstance boss = RaidBossSpawnManager.getInstance().getBosses().get(TYPHOON);
+		if (boss != null)
+		{
+			onSpawn(boss);
+		}
+	}
+	
 	@Override
 	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
@@ -60,22 +74,8 @@ public class Typhoon extends L2AttackableAIScript
 		return super.onSpawn(npc);
 	}
 	
-	public Typhoon(int id, String name, String descr)
-	{
-		super(id, name, descr);
-		
-		addAggroRangeEnterId(TYPHOON);
-		addSpawnId(TYPHOON);
-		
-		final L2RaidBossInstance boss = RaidBossSpawnManager.getInstance().getBosses().get(TYPHOON);
-		if (boss != null)
-		{
-			onSpawn(boss);
-		}
-	}
-	
 	public static void main(String[] args)
 	{
-		new Typhoon(-1, "typhoon", "ai");
+		new Typhoon(Typhoon.class.getSimpleName(), "ai");
 	}
 }

+ 99 - 45
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Valakas.java

@@ -17,7 +17,7 @@ package ai.individual;
 import java.util.ArrayList;
 import java.util.List;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GeoData;
@@ -40,9 +40,10 @@ import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
 import com.l2jserver.gameserver.util.Util;
 
 /**
+ * Valakas AI
  * @author Tryskell
  */
-public class Valakas extends L2AttackableAIScript
+public class Valakas extends AbstractNpcAI
 {
 	private long _timeTracker = 0; // Time tracker for last attack on Valakas.
 	private L2Playable _actualVictim; // Actual target of Valakas.
@@ -162,19 +163,14 @@ public class Valakas extends L2AttackableAIScript
 		}
 	};
 	
-	private static L2BossZone _Zone;
+	private static L2BossZone ZONE;
 	
-	public Valakas(int questId, String name, String descr)
+	private Valakas(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
+		registerMobs(VALAKAS);
 		
-		int[] mob =
-		{
-			VALAKAS
-		};
-		registerMobs(mob);
-		
-		_Zone = GrandBossManager.getInstance().getZone(212852, -114842, -1632);
+		ZONE = GrandBossManager.getInstance().getZone(212852, -114842, -1632);
 		
 		final StatsSet info = GrandBossManager.getInstance().getStatsSet(VALAKAS);
 		final int status = GrandBossManager.getInstance().getBossStatus(VALAKAS);
@@ -232,7 +228,9 @@ public class Valakas extends L2AttackableAIScript
 				
 				// Start timer to lock entry after 30 minutes
 				if (status == WAITING)
+				{
 					startQuestTimer("beginning", Config.Valakas_Wait_Time, valakas, null);
+				}
 			}
 		}
 	}
@@ -251,7 +249,7 @@ public class Valakas extends L2AttackableAIScript
 				npc.teleToLocation(212852, -114842, -1632);
 				
 				// Sound + socialAction.
-				for (L2PcInstance plyr : _Zone.getPlayersInside())
+				for (L2PcInstance plyr : ZONE.getPlayersInside())
 				{
 					plyr.sendPacket(new PlaySound(1, "B03_A", 0, 0, 0, 0, 0));
 					plyr.sendPacket(new SocialAction(npc.getObjectId(), 3));
@@ -275,7 +273,7 @@ public class Valakas extends L2AttackableAIScript
 				// Inactivity task - 15min
 				if (GrandBossManager.getInstance().getBossStatus(VALAKAS) == FIGHTING)
 				{
-					if (_timeTracker + 900000 < System.currentTimeMillis())
+					if ((_timeTracker + 900000) < System.currentTimeMillis())
 					{
 						npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 						npc.teleToLocation(-105200, -253104, -15264);
@@ -284,7 +282,7 @@ public class Valakas extends L2AttackableAIScript
 						npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
 						
 						// Drop all players from the zone.
-						_Zone.oustAllPlayers();
+						ZONE.oustAllPlayers();
 						
 						// Cancel skill_task and regen_task.
 						cancelQuestTimer("regen_task", npc, null);
@@ -297,7 +295,7 @@ public class Valakas extends L2AttackableAIScript
 				
 				// Verify if "Valakas Regeneration" skill is active.
 				final L2Effect[] effects = npc.getAllEffects();
-				if (effects != null && effects.length != 0)
+				if ((effects != null) && (effects.length != 0))
 				{
 					for (L2Effect e : effects)
 					{
@@ -310,19 +308,19 @@ public class Valakas extends L2AttackableAIScript
 				}
 				
 				// Current HPs are inferior to 25% ; apply lvl 4 of regen skill.
-				if (npc.getCurrentHp() < (npc.getMaxHp() / 4) && lvl != 4)
+				if ((npc.getCurrentHp() < (npc.getMaxHp() / 4)) && (lvl != 4))
 				{
 					npc.setTarget(npc);
 					npc.doCast(SkillTable.getInstance().getInfo(4691, 4));
 				}
 				// Current HPs are inferior to 50% ; apply lvl 3 of regen skill.
-				else if (npc.getCurrentHp() < ((npc.getMaxHp() * 2) / 4.0) && lvl != 3)
+				else if ((npc.getCurrentHp() < ((npc.getMaxHp() * 2) / 4.0)) && (lvl != 3))
 				{
 					npc.setTarget(npc);
 					npc.doCast(SkillTable.getInstance().getInfo(4691, 3));
 				}
 				// Current HPs are inferior to 75% ; apply lvl 2 of regen skill.
-				else if (npc.getCurrentHp() < ((npc.getMaxHp() * 3) / 4.0) && lvl != 2)
+				else if ((npc.getCurrentHp() < ((npc.getMaxHp() * 3) / 4.0)) && (lvl != 2))
 				{
 					npc.setTarget(npc);
 					npc.doCast(SkillTable.getInstance().getInfo(4691, 2));
@@ -336,23 +334,41 @@ public class Valakas extends L2AttackableAIScript
 			}
 			// Spawn cinematic, regen_task and choose of skill.
 			else if (event.equalsIgnoreCase("spawn_1"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1800, 180, -1, 1500, 10000, 0, 0, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1800, 180, -1, 1500, 10000, 0, 0, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_2"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1300, 180, -5, 3000, 10000, 0, -5, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1300, 180, -5, 3000, 10000, 0, -5, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_3"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 500, 180, -8, 600, 10000, 0, 60, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 500, 180, -8, 600, 10000, 0, 60, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_4"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 800, 180, -8, 2700, 10000, 0, 30, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 800, 180, -8, 2700, 10000, 0, 30, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_5"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 200, 250, 70, 0, 10000, 30, 80, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 200, 250, 70, 0, 10000, 30, 80, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_6"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1100, 250, 70, 2500, 10000, 30, 80, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1100, 250, 70, 2500, 10000, 30, 80, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_7"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 700, 150, 30, 0, 10000, -10, 60, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 700, 150, 30, 0, 10000, -10, 60, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_8"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1200, 150, 20, 2900, 10000, -10, 30, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1200, 150, 20, 2900, 10000, -10, 30, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_9"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 750, 170, -10, 3400, 4000, 10, -15, 1, 0));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 750, 170, -10, 3400, 4000, 10, -15, 1, 0));
+			}
 			else if (event.equalsIgnoreCase("spawn_10"))
 			{
 				GrandBossManager.getInstance().setBossStatus(VALAKAS, FIGHTING);
@@ -363,30 +379,48 @@ public class Valakas extends L2AttackableAIScript
 			}
 			// Death cinematic, spawn of Teleport Cubes.
 			else if (event.equalsIgnoreCase("die_1"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 2000, 130, -1, 0, 10000, 0, 0, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 2000, 130, -1, 0, 10000, 0, 0, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_2"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1100, 210, -5, 3000, 10000, -13, 0, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1100, 210, -5, 3000, 10000, -13, 0, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_3"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1300, 200, -8, 3000, 10000, 0, 15, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1300, 200, -8, 3000, 10000, 0, 15, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_4"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1000, 190, 0, 500, 10000, 0, 10, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1000, 190, 0, 500, 10000, 0, 10, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_5"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 120, 0, 2500, 10000, 12, 40, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 120, 0, 2500, 10000, 12, 40, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_6"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 20, 0, 700, 10000, 10, 10, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 20, 0, 700, 10000, 10, 10, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_7"))
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 10, 0, 1000, 10000, 20, 70, 1, 1));
+			{
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 10, 0, 1000, 10000, 20, 70, 1, 1));
+			}
 			else if (event.equalsIgnoreCase("die_8"))
 			{
-				_Zone.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 10, 0, 300, 250, 20, -20, 1, 1));
+				ZONE.broadcastPacket(new SpecialCamera(npc.getObjectId(), 1700, 10, 0, 300, 250, 20, -20, 1, 1));
 				
 				for (int[] element : _teleportCubeLocation)
+				{
 					addSpawn(31759, element[0], element[1], element[2], 0, false, 900000);
+				}
 				
 				startQuestTimer("remove_players", 900000, null, null);
 			}
 			else if (event.equalsIgnoreCase("skill_task"))
+			{
 				callSkillAI(npc);
+			}
 		}
 		else
 		{
@@ -397,7 +431,9 @@ public class Valakas extends L2AttackableAIScript
 				GrandBossManager.getInstance().setBossStatus(VALAKAS, DORMANT);
 			}
 			else if (event.equalsIgnoreCase("remove_players"))
-				_Zone.oustAllPlayers();
+			{
+				ZONE.oustAllPlayers();
+			}
 		}
 		return super.onAdvEvent(event, npc, player);
 	}
@@ -412,14 +448,16 @@ public class Valakas extends L2AttackableAIScript
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
 	{
-		if (!_Zone.isInsideZone(attacker))
+		if (!ZONE.isInsideZone(attacker))
 		{
 			attacker.doDie(attacker);
 			return null;
 		}
 		
 		if (npc.isInvul())
+		{
 			return null;
+		}
 		
 		if (GrandBossManager.getInstance().getBossStatus(VALAKAS) != FIGHTING)
 		{
@@ -450,7 +488,7 @@ public class Valakas extends L2AttackableAIScript
 		cancelQuestTimer("skill_task", npc, null);
 		
 		// Launch death animation.
-		_Zone.broadcastPacket(new PlaySound(1, "B03_D", 0, 0, 0, 0, 0));
+		ZONE.broadcastPacket(new PlaySound(1, "B03_D", 0, 0, 0, 0, 0));
 		
 		startQuestTimer("die_1", 300, npc, null); // 300
 		startQuestTimer("die_2", 600, npc, null); // 300
@@ -483,11 +521,15 @@ public class Valakas extends L2AttackableAIScript
 	private void callSkillAI(L2Npc npc)
 	{
 		if (npc.isInvul() || npc.isCastingNow())
+		{
 			return;
+		}
 		
 		// Pickup a target if no or dead victim. 10% luck he decides to reconsiders his target.
-		if (_actualVictim == null || _actualVictim.isDead() || !(npc.getKnownList().knowsObject(_actualVictim)) || getRandom(10) == 0)
+		if ((_actualVictim == null) || _actualVictim.isDead() || !(npc.getKnownList().knowsObject(_actualVictim)) || (getRandom(10) == 0))
+		{
 			_actualVictim = getRandomTarget(npc);
+		}
 		
 		// If result is still null, Valakas will roam. Don't go deeper in skill AI.
 		if (_actualVictim == null)
@@ -502,7 +544,9 @@ public class Valakas extends L2AttackableAIScript
 				int posY = y + getRandom(-1400, 1400);
 				
 				if (GeoData.getInstance().canMoveFromToTarget(x, y, z, posX, posY, z, npc.getInstanceId()))
+				{
 					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(posX, posY, z, 0));
+				}
 			}
 			return;
 		}
@@ -533,25 +577,31 @@ public class Valakas extends L2AttackableAIScript
 	 */
 	private int getRandomSkill(L2Npc npc)
 	{
-		final int hpRatio = (int) (npc.getCurrentHp() / npc.getMaxHp() * 100);
+		final int hpRatio = (int) ((npc.getCurrentHp() / npc.getMaxHp()) * 100);
 		
 		// Valakas Lava Skin is prioritary.
-		if (hpRatio < 75 && getRandom(150) == 0 && npc.getFirstEffect(4680) == null)
+		if ((hpRatio < 75) && (getRandom(150) == 0) && (npc.getFirstEffect(4680) == null))
+		{
 			return 4680;
+		}
 		
 		// Valakas will use mass spells if he feels surrounded.
 		if (Util.getPlayersCountInRadius(1200, npc, false, false) >= 20)
+		{
 			return VALAKAS_AOE_SKILLS[getRandom(VALAKAS_AOE_SKILLS.length)];
+		}
 		
 		if (hpRatio > 50)
+		{
 			return VALAKAS_REGULAR_SKILLS[getRandom(VALAKAS_REGULAR_SKILLS.length)];
+		}
 		
 		return VALAKAS_LOWHP_SKILLS[getRandom(VALAKAS_LOWHP_SKILLS.length)];
 	}
 	
 	/**
 	 * Pickup a random L2Playable from the zone, deads targets aren't included.
-	 * @param npc 
+	 * @param npc
 	 * @return a random L2Playable.
 	 */
 	private L2Playable getRandomTarget(L2Npc npc)
@@ -560,10 +610,14 @@ public class Valakas extends L2AttackableAIScript
 		
 		for (L2Character obj : npc.getKnownList().getKnownCharacters())
 		{
-			if (obj == null || obj.isPet())
+			if ((obj == null) || obj.isPet())
+			{
 				continue;
+			}
 			else if (!obj.isDead() && obj.isPlayable())
+			{
 				result.add((L2Playable) obj);
+			}
 		}
 		
 		return (result.isEmpty()) ? null : result.get(getRandom(result.size()));
@@ -571,6 +625,6 @@ public class Valakas extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		new Valakas(-1, Valakas.class.getSimpleName(), "ai");
+		new Valakas(Valakas.class.getSimpleName(), "ai");
 	}
 }

+ 8 - 6
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Zaken.java

@@ -16,7 +16,7 @@ package ai.individual;
 
 import java.util.logging.Logger;
 
-import ai.group_template.L2AttackableAIScript;
+import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GameTimeController;
@@ -40,7 +40,7 @@ import com.l2jserver.gameserver.network.serverpackets.PlaySound;
 /**
  * Zaken AI
  */
-public class Zaken extends L2AttackableAIScript
+public class Zaken extends AbstractNpcAI
 {
 	protected static final Logger log = Logger.getLogger(Zaken.class.getName());
 	
@@ -81,6 +81,7 @@ public class Zaken extends L2AttackableAIScript
 		53950,
 		53930
 	};
+	
 	private static final int[] Ycoords =
 	{
 		219860,
@@ -99,6 +100,7 @@ public class Zaken extends L2AttackableAIScript
 		219860,
 		217760
 	};
+	
 	private static final int[] Zcoords =
 	{
 		-3488,
@@ -124,9 +126,9 @@ public class Zaken extends L2AttackableAIScript
 	
 	private static L2BossZone _Zone;
 	
-	public Zaken(int questId, String name, String descr)
+	private Zaken(String name, String descr)
 	{
-		super(questId, name, descr);
+		super(name, descr);
 		
 		// Zaken doors handling
 		ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable()
@@ -171,6 +173,7 @@ public class Zaken extends L2AttackableAIScript
 			pirates_zombie_captain_b,
 			pirates_zombie_b
 		};
+		
 		registerMobs(mobs);
 		_Zone = GrandBossManager.getInstance().getZone(55312, 219168, -3223);
 		
@@ -1055,7 +1058,6 @@ public class Zaken extends L2AttackableAIScript
 	
 	public static void main(String[] args)
 	{
-		// now call the constructor (starts up the ai)
-		new Zaken(-1, "zaken", "ai");
+		new Zaken(Zaken.class.getSimpleName(), "ai");
 	}
 }

+ 85 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/AbstractNpcAI.java

@@ -14,9 +14,15 @@
  */
 package ai.npc;
 
+import java.util.logging.Logger;
+
+import com.l2jserver.gameserver.ai.CtrlIntention;
+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.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.serverpackets.NpcSay;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
@@ -29,6 +35,8 @@ import com.l2jserver.gameserver.util.Broadcast;
  */
 public abstract class AbstractNpcAI extends L2Script
 {
+	public Logger _log = Logger.getLogger(getClass().getSimpleName());
+	
 	/**
 	 * Simple on first talk event handler.
 	 */
@@ -43,6 +51,61 @@ public abstract class AbstractNpcAI extends L2Script
 		super(-1, name, descr);
 	}
 	
+	/**
+	 * Registers the fallowing events to the current script:<br>
+	 * <ul>
+	 * 	<li>ON_ATTACK</li>
+	 * 	<li>ON_KILL</li>
+	 * 	<li>ON_SPAWN</li>
+	 * 	<li>ON_SPELL_FINISHED</li>
+	 * 	<li>ON_SKILL_SEE</li>
+	 * 	<li>ON_FACTION_CALL</li>
+	 * 	<li>ON_AGGR_RANGE_ENTER</li>
+	 * </ul>
+	 * @param mobs
+	 */
+	public void registerMobs(int... mobs)
+	{
+		for (int id : mobs)
+		{
+			addEventId(id, QuestEventType.ON_ATTACK);
+			addEventId(id, QuestEventType.ON_KILL);
+			addEventId(id, QuestEventType.ON_SPAWN);
+			addEventId(id, QuestEventType.ON_SPELL_FINISHED);
+			addEventId(id, QuestEventType.ON_SKILL_SEE);
+			addEventId(id, QuestEventType.ON_FACTION_CALL);
+			addEventId(id, QuestEventType.ON_AGGRO_RANGE_ENTER);
+		}
+	}
+	
+	/**
+	 * This is used to register all monsters contained in mobs for a particular script
+	 * event types defined in types.
+	 * @param mobs
+	 * @param types
+	 */
+	public void registerMobs(int[] mobs, QuestEventType... types)
+	{
+		for (int id : mobs)
+		{
+			for (QuestEventType type : types)
+			{
+				addEventId(id, type);
+			}
+		}
+	}
+	
+	public void registerMobs(Iterable<Integer> mobs, QuestEventType... types)
+	{
+		for (int id : mobs)
+		{
+			for (QuestEventType type : types)
+			{
+				addEventId(id, type);
+			}
+		}
+	}
+	
 	/**
 	 * Broadcasts NpcSay packet to all known players with custom string.
 	 * @param npc
@@ -109,4 +172,26 @@ public abstract class AbstractNpcAI extends L2Script
 	{
 		Broadcast.toSelfAndKnownPlayersInRadius(character, new SocialAction(character.getObjectId(), actionId), radius);
 	}
+	
+	/**
+	 * Give item/reward to the player
+	 * @param player
+	 * @param holder
+	 */
+	protected void giveItems(L2PcInstance player, ItemHolder holder)
+	{
+		super.giveItems(player, holder.getId(), holder.getCount());
+	}
+	
+	/**
+	 * Monster is running and attacking the playable.
+	 * @param npc
+	 * @param playable
+	 */
+	protected void attackPlayer(L2Attackable npc, L2Playable playable)
+	{
+		npc.setIsRunning(true);
+		npc.addDamageHate(playable, 0, 999);
+		npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, playable);
+	}
 }