Browse Source

BETA: Data Pack for [L6665]

Zealar 10 years ago
parent
commit
2131eb828c
34 changed files with 309 additions and 554 deletions
  1. 1 16
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DragonValley.java
  2. 0 12
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/LairOfAntharas.java
  3. 5 17
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MinionSpawnManager.java
  4. 10 9
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MonasteryOfSilence.java
  5. 0 6
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/NonLethalableNpcs.java
  6. 0 10
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/NonTalkingNpcs.java
  7. 0 18
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrimevalIsle.java
  8. 0 12
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java
  9. 5 9
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/RandomSpawn.java
  10. 0 13
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeeThroughSilentMove.java
  11. 10 30
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SelMahumDrill.java
  12. 13 28
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SelMahumSquad.java
  13. 16 25
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Anais.java
  14. 48 39
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DrChaos.java
  15. 0 7
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/EvasGiftBox.java
  16. 14 35
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/GraveRobbers.java
  17. 15 45
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/RagnaOrcCommander.java
  18. 14 39
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/RagnaOrcHero.java
  19. 15 37
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/RagnaOrcSeer.java
  20. 20 15
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Venom/Venom.java
  21. 34 12
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java
  22. 3 12
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/TownPets/TownPets.java
  23. 18 11
      L2J_DataPack_BETA/dist/game/data/scripts/gracia/AI/NPC/GeneralDilios/GeneralDilios.java
  24. 17 18
      L2J_DataPack_BETA/dist/game/data/scripts/gracia/AI/NPC/ZealotOfShilen/ZealotOfShilen.java
  25. 0 22
      L2J_DataPack_BETA/dist/game/data/scripts/gracia/AI/SeedOfAnnihilation/SeedOfAnnihilation.java
  26. 4 0
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminAdmin.java
  27. 1 4
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Amaskari.java
  28. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Chimeras.java
  29. 4 7
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Keltas.java
  30. 1 4
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/NPC/Shadai/Shadai.java
  31. 1 4
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Typhoon.java
  32. 30 34
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Zones/AnomicFoundry/AnomicFoundry.java
  33. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Zones/TowerOfNaia/TowerOfNaia.java
  34. 8 2
      L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00457_LostAndFound/Q00457_LostAndFound.java

+ 1 - 16
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DragonValley.java

@@ -22,8 +22,6 @@ import java.util.EnumMap;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Playable;
@@ -136,22 +134,9 @@ public final class DragonValley extends AbstractNpcAI
 		addAttackId(SUMMON_NPC);
 		addKillId(NECROMANCER_OF_THE_VALLEY);
 		addKillId(SPOIL_REACT_MONSTER);
-		addSpawnId(EXPLODING_ORC_GHOST);
+		addSpawnId(EXPLODING_ORC_GHOST, NECROMANCER_OF_THE_VALLEY);
 		addSpawnId(SPOIL_REACT_MONSTER);
 		addSpellFinishedId(EXPLODING_ORC_GHOST);
-		
-		for (int npcId : SPOIL_REACT_MONSTER)
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(spawn.getLastSpawn());
-			}
-		}
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(NECROMANCER_OF_THE_VALLEY))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override

+ 0 - 12
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/LairOfAntharas.java

@@ -18,12 +18,8 @@
  */
 package ai.group_template;
 
-import java.util.Arrays;
-
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -57,14 +53,6 @@ public final class LairOfAntharas extends AbstractNpcAI
 		addSpawnId(DRAGON_KNIGHT, DRAGON_KNIGHT2, DRAGON_GUARD, DRAGON_MAGE);
 		addMoveFinishedId(DRAGON_GUARD, DRAGON_MAGE);
 		addAggroRangeEnterId(KNORIKS);
-		
-		for (int npcId : Arrays.asList(DRAGON_KNIGHT, DRAGON_KNIGHT2, DRAGON_GUARD, DRAGON_MAGE))
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(spawn.getLastSpawn());
-			}
-		}
 	}
 	
 	@Override

+ 5 - 17
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/MinionSpawnManager.java

@@ -23,16 +23,12 @@ import java.util.Set;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.NpcData;
 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.actor.instance.L2RaidBossInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.holders.MinionHolder;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
-import com.l2jserver.util.Rnd;
 
 /**
  * Minion Spawn Manager.
@@ -424,12 +420,9 @@ public final class MinionSpawnManager extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if ((npc instanceof L2MonsterInstance) || (npc instanceof L2RaidBossInstance))
+		if (npc.getTemplate().getParameters().getSet().get("SummonPrivateRate") == null)
 		{
-			if (!npc.getTemplate().getParameters().getSet().containsKey("SummonPrivateRate"))
-			{
-				((L2MonsterInstance) npc).getMinionList().spawnMinions(npc.getTemplate().getParameters().getMinionList("Privates"));
-			}
+			((L2MonsterInstance) npc).getMinionList().spawnMinions(npc.getTemplate().getParameters().getMinionList("Privates"));
 		}
 		return super.onSpawn(npc);
 	}
@@ -442,16 +435,11 @@ public final class MinionSpawnManager extends AbstractNpcAI
 			L2MonsterInstance monster = (L2MonsterInstance) npc;
 			if (!monster.hasMinions())
 			{
-				final int summonPrivateRate = npc.getTemplate().getParameters().getInt("SummonPrivateRate", 0);
-				if (Rnd.get(1, 100) <= summonPrivateRate)
+				if (getRandom(1, 100) <= npc.getTemplate().getParameters().getInt("SummonPrivateRate", 0))
 				{
-					L2NpcTemplate template = NpcData.getInstance().getTemplate(npc.getId());
-					if (template.getParameters().getMinionList("Privates") != null)
+					for (MinionHolder is : npc.getTemplate().getParameters().getMinionList("Privates"))
 					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
+						addMinion((L2MonsterInstance) npc, is.getId());
 					}
 					broadcastNpcSay(npc, Say2.NPC_ALL, ON_ATTACK_MSG[getRandom(ON_ATTACK_MSG.length)]);
 				}

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

@@ -21,9 +21,7 @@ package ai.group_template;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -82,13 +80,7 @@ public final class MonasteryOfSilence extends AbstractNpcAI
 		addAttackId(KNIGHT, CAPTAIN, GUIDE, SEEKER, ASCETIC);
 		addNpcHateId(GUIDE, SEEKER, SAVIOR, ASCETIC);
 		addAggroRangeEnterId(GUIDE, SEEKER, SAVIOR, ASCETIC);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(SCARECROW))
-		{
-			spawn.getLastSpawn().setIsInvul(true);
-			spawn.getLastSpawn().disableCoreAI(true);
-			startQuestTimer("TRAINING", 30000, spawn.getLastSpawn(), null, true);
-		}
+		addSpawnId(SCARECROW);
 	}
 	
 	@Override
@@ -289,6 +281,15 @@ public final class MonasteryOfSilence extends AbstractNpcAI
 		return super.onSkillSee(npc, caster, skill, targets, isSummon);
 	}
 	
+	@Override
+	public String onSpawn(L2Npc npc)
+	{
+		npc.setIsInvul(true);
+		npc.disableCoreAI(true);
+		startQuestTimer("TRAINING", 30000, npc, null, true);
+		return super.onSpawn(npc);
+	}
+	
 	public static void main(String[] args)
 	{
 		new MonasteryOfSilence();

+ 0 - 6
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/NonLethalableNpcs.java

@@ -20,8 +20,6 @@ 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.L2Npc;
 
 /**
@@ -35,10 +33,6 @@ public class NonLethalableNpcs extends AbstractNpcAI
 	{
 		super(NonLethalableNpcs.class.getSimpleName(), "ai/group_template");
 		addSpawnId(HEADQUARTERS);
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(HEADQUARTERS))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override

+ 0 - 10
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/NonTalkingNpcs.java

@@ -20,8 +20,6 @@ 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.L2Npc;
 
 /**
@@ -60,14 +58,6 @@ public final class NonTalkingNpcs extends AbstractNpcAI
 	{
 		super(NonTalkingNpcs.class.getSimpleName(), "ai/group_template");
 		addSpawnId(NONTALKINGNPCS);
-		
-		for (int npcId : NONTALKINGNPCS)
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(spawn.getLastSpawn());
-			}
-		}
 	}
 	
 	@Override

+ 0 - 18
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrimevalIsle.java

@@ -22,10 +22,8 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.handler.IItemHandler;
 import com.l2jserver.gameserver.handler.ItemHandler;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
@@ -120,22 +118,6 @@ public final class PrimevalIsle extends AbstractNpcAI
 		addKillId(EGG, SAILREN, DEINO, ORNIT);
 		addSeeCreatureId(TREX);
 		addSeeCreatureId(MONSTERS);
-		
-		for (int npcId : SPRIGNANT)
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(spawn.getLastSpawn());
-			}
-		}
-		
-		for (int npcId : TREX)
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(spawn.getLastSpawn());
-			}
-		}
 	}
 	
 	@Override

+ 0 - 12
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java

@@ -20,9 +20,7 @@ package ai.group_template;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -55,16 +53,6 @@ public final class PrisonGuards extends AbstractNpcAI
 		addNpcHateId(GUARD);
 		addSkillSeeId(GUARD);
 		addSpellFinishedId(GUARD_HEAD, GUARD);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(GUARD_HEAD))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(GUARD))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override

+ 5 - 9
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/RandomSpawn.java

@@ -88,17 +88,13 @@ public final class RandomSpawn extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
+		final Location[] spawnlist = SPAWN_POINTS.get(npc.getId());
+		final Location loc = spawnlist[getRandom(spawnlist.length)];
+		if (!npc.isInsideRadius(loc, 200, false, false))
 		{
-			final Location[] spawnlist = SPAWN_POINTS.get(npc.getId());
-			final Location loc = spawnlist[getRandom(spawnlist.length)];
-			if (!npc.isInsideRadius(loc, 200, false, false))
-			{
-				npc.getSpawn().setLocation(loc);
-				ThreadPoolManager.getInstance().scheduleGeneral(new Teleport(npc, loc), 100);
-			}
+			npc.getSpawn().setLocation(loc);
+			ThreadPoolManager.getInstance().scheduleGeneral(new Teleport(npc, loc), 100);
 		}
-		
 		return super.onSpawn(npc);
 	}
 	

+ 0 - 13
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeeThroughSilentMove.java

@@ -20,8 +20,6 @@ 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;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 
@@ -45,17 +43,6 @@ public class SeeThroughSilentMove extends AbstractNpcAI
 	private SeeThroughSilentMove()
 	{
 		super(SeeThroughSilentMove.class.getSimpleName(), "ai/group_template");
-		for (int npcId : MONSTERS)
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				final L2Npc npc = spawn.getLastSpawn();
-				if ((npc != null) && npc.isAttackable())
-				{
-					((L2Attackable) npc).setSeeThroughSilentMove(true);
-				}
-			}
-		}
 		addSpawnId(MONSTERS);
 	}
 	

+ 10 - 30
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SelMahumDrill.java

@@ -136,23 +136,6 @@ public final class SelMahumDrill extends AbstractNpcAI
 		addEventReceivedId(MAHUM_SOLDIERS);
 		addSpawnId(MAHUM_CHIEFS);
 		addSpawnId(MAHUM_SOLDIERS);
-		
-		// Send event to monsters, that was spawned through SpawnTable at server start (it is impossible to track first spawn)
-		for (int npcId : MAHUM_CHIEFS)
-		{
-			for (L2Spawn npcSpawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(npcSpawn.getLastSpawn());
-			}
-		}
-		for (int npcId : MAHUM_SOLDIERS)
-		{
-			for (L2Spawn npcSpawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(npcSpawn.getLastSpawn());
-			}
-		}
-		
 		// Start global return home timer
 		startQuestTimer("return_home", 120000, null, null, true);
 	}
@@ -288,21 +271,18 @@ public final class SelMahumDrill extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
+		if (Util.contains(MAHUM_CHIEFS, npc.getId()))
 		{
-			if (Util.contains(MAHUM_CHIEFS, npc.getId()))
-			{
-				startQuestTimer("do_social_action", 15000, npc, null);
-			}
-			
-			else if ((getRandom(18) < 1) && Util.contains(MAHUM_SOLDIERS, npc.getId()))
-			{
-				npc.getVariables().set("SOCIAL_ACTION_ALT_BEHAVIOR", 1);
-			}
-			
-			// Restore AI handling by core
-			npc.disableCoreAI(false);
+			startQuestTimer("do_social_action", 15000, npc, null);
 		}
+		
+		else if ((getRandom(18) < 1) && Util.contains(MAHUM_SOLDIERS, npc.getId()))
+		{
+			npc.getVariables().set("SOCIAL_ACTION_ALT_BEHAVIOR", 1);
+		}
+		
+		// Restore AI handling by core
+		npc.disableCoreAI(false);
 		return null;
 	}
 	

+ 13 - 28
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SelMahumSquad.java

@@ -23,9 +23,7 @@ import ai.npc.AbstractNpcAI;
 import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.SkillData;
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.model.L2Object;
-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;
@@ -86,16 +84,6 @@ public final class SelMahumSquad extends AbstractNpcAI
 		addSpawnId(CHEF, FIRE);
 		addSpawnId(SQUAD_LEADERS);
 		addSpellFinishedId(CHEF);
-		
-		// Send event to monsters, that was spawned through SpawnTable at server start (it is impossible to track first spawn)
-		for (L2Spawn npcSpawn : SpawnTable.getInstance().getSpawns(CHEF))
-		{
-			onSpawn(npcSpawn.getLastSpawn());
-		}
-		for (L2Spawn npcSpawn : SpawnTable.getInstance().getSpawns(FIRE))
-		{
-			onSpawn(npcSpawn.getLastSpawn());
-		}
 	}
 	
 	@Override
@@ -358,23 +346,20 @@ public final class SelMahumSquad extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
+		if (npc.getId() == CHEF)
 		{
-			if (npc.getId() == CHEF)
-			{
-				npc.setIsInvul(false);
-			}
-			
-			else if (npc.getId() == FIRE)
-			{
-				startQuestTimer("fire", 1000, npc, null);
-			}
-			
-			else if (Util.contains(SQUAD_LEADERS, npc.getId()))
-			{
-				npc.setDisplayEffect(3);
-				npc.setIsNoRndWalk(false);
-			}
+			npc.setIsInvul(false);
+		}
+		
+		else if (npc.getId() == FIRE)
+		{
+			startQuestTimer("fire", 1000, npc, null);
+		}
+		
+		else if (Util.contains(SQUAD_LEADERS, npc.getId()))
+		{
+			npc.setDisplayEffect(3);
+			npc.setIsNoRndWalk(false);
 		}
 		return null;
 	}

+ 16 - 25
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Anais.java

@@ -18,13 +18,12 @@
  */
 package ai.individual;
 
+import java.util.ArrayList;
 import java.util.Map;
 
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -45,8 +44,7 @@ public final class Anais extends AbstractNpcAI
 	// Skill
 	private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
 	// Instances
-	private final L2Npc[] _divineBurners = new L2Npc[4];
-	private L2Npc _anais = null;
+	ArrayList<L2Npc> _divineBurners = new ArrayList<>(4);
 	private L2PcInstance _nextTarget = null;
 	private L2Npc _current = null;
 	private int _pot = 0;
@@ -55,26 +53,27 @@ public final class Anais extends AbstractNpcAI
 	{
 		super(Anais.class.getSimpleName(), "ai/individual");
 		addAttackId(ANAIS);
+		addSpawnId(DIVINE_BURNER);
 		addKillId(GRAIL_WARD);
 	}
 	
-	private void burnerOnAttack(int pot)
+	private void burnerOnAttack(int pot, L2Npc anais)
 	{
-		L2Npc npc = _divineBurners[pot];
+		L2Npc npc = _divineBurners.get(pot);
 		npc.setDisplayEffect(1);
 		npc.setIsRunning(false);
 		if (pot < 4)
 		{
 			_current = npc;
-			QuestTimer checkAround = getQuestTimer("CHECK", _anais, null);
+			QuestTimer checkAround = getQuestTimer("CHECK", anais, null);
 			if (checkAround == null) // || !checkAround.getIsActive()
 			{
-				startQuestTimer("CHECK", 3000, _anais, null);
+				startQuestTimer("CHECK", 3000, anais, null);
 			}
 		}
 		else
 		{
-			cancelQuestTimer("CHECK", _anais, null);
+			cancelQuestTimer("CHECK", anais, null);
 		}
 	}
 	
@@ -90,14 +89,14 @@ public final class Anais extends AbstractNpcAI
 				}
 				if ((_current != null) || (_pot < 4))
 				{
-					Map<Integer, L2PcInstance> players = _anais.getKnownList().getKnownPlayers();
+					Map<Integer, L2PcInstance> players = npc.getKnownList().getKnownPlayers();
 					L2PcInstance target = players.get(getRandom(players.size() - 1));
 					_nextTarget = target;
 					if (_nextTarget == null)
 					{
-						_nextTarget = (L2PcInstance) _anais.getTarget();
+						_nextTarget = (L2PcInstance) npc.getTarget();
 					}
-					L2Npc b = _divineBurners[_pot];
+					L2Npc b = _divineBurners.get(_pot);
 					_pot = _pot + 1;
 					b.setDisplayEffect(1);
 					b.setIsRunning(false);
@@ -145,19 +144,19 @@ public final class Anais extends AbstractNpcAI
 	{
 		if (_pot == 0)
 		{
-			burnerOnAttack(0);
+			burnerOnAttack(0, npc);
 		}
 		else if ((npc.getCurrentHp() <= (npc.getMaxRecoverableHp() * 0.75)) && (_pot == 1))
 		{
-			burnerOnAttack(1);
+			burnerOnAttack(1, npc);
 		}
 		else if ((npc.getCurrentHp() <= (npc.getMaxRecoverableHp() * 0.5)) && (_pot == 2))
 		{
-			burnerOnAttack(2);
+			burnerOnAttack(2, npc);
 		}
 		else if ((npc.getCurrentHp() <= (npc.getMaxRecoverableHp() * 0.25)) && (_pot == 3))
 		{
-			burnerOnAttack(3);
+			burnerOnAttack(3, npc);
 		}
 		return super.onAttack(npc, attacker, damage, isSummon);
 	}
@@ -169,15 +168,7 @@ public final class Anais extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
-		{
-			int i = 0;
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(DIVINE_BURNER))
-			{
-				_divineBurners[i++] = spawn.getLastSpawn();
-			}
-			_anais = SpawnTable.getInstance().getFirstSpawn(ANAIS).getLastSpawn();
-		}
+		_divineBurners.add(npc);
 		return super.onSpawn(npc);
 	}
 	

+ 48 - 39
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DrChaos.java

@@ -53,56 +53,65 @@ public final class DrChaos extends Quest
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
-		if (event.equalsIgnoreCase("1"))
+		switch (event)
 		{
-			L2Npc machine = null;
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(STRANGE_MACHINE))
+			case "1":
 			{
-				if (spawn != null)
+				L2Npc machine = null;
+				for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(STRANGE_MACHINE))
 				{
-					machine = spawn.getLastSpawn();
+					if (spawn != null)
+					{
+						machine = spawn.getLastSpawn();
+					}
 				}
+				if (machine != null)
+				{
+					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, machine);
+					machine.broadcastPacket(new SpecialCamera(machine, 1, -200, 15, 10000, 1000, 20000, 0, 0, 0, 0, 0));
+				}
+				else
+				{
+					startQuestTimer("2", 2000, npc, player);
+				}
+				startQuestTimer("3", 10000, npc, player);
+				break;
 			}
-			if (machine != null)
+			case "2":
 			{
-				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, machine);
-				machine.broadcastPacket(new SpecialCamera(machine, 1, -200, 15, 10000, 1000, 20000, 0, 0, 0, 0, 0));
+				npc.broadcastSocialAction(3);
+				break;
 			}
-			else
+			case "3":
 			{
-				startQuestTimer("2", 2000, npc, player);
+				npc.broadcastPacket(new SpecialCamera(npc, 1, -150, 10, 3000, 1000, 20000, 0, 0, 0, 0, 0));
+				startQuestTimer("4", 2500, npc, player);
+				break;
 			}
-			startQuestTimer("3", 10000, npc, player);
-		}
-		else if (event.equalsIgnoreCase("2"))
-		{
-			npc.broadcastSocialAction(3);
-		}
-		else if (event.equalsIgnoreCase("3"))
-		{
-			npc.broadcastPacket(new SpecialCamera(npc, 1, -150, 10, 3000, 1000, 20000, 0, 0, 0, 0, 0));
-			startQuestTimer("4", 2500, npc, player);
-		}
-		else if (event.equalsIgnoreCase("4"))
-		{
-			npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(96055, -110759, -3312, 0));
-			startQuestTimer("5", 2000, npc, player);
-		}
-		else if (event.equalsIgnoreCase("5"))
-		{
-			player.teleToLocation(PLAYER_TELEPORT);
-			npc.teleToLocation(NPC_LOCATION);
-			if (!_IsGolemSpawned)
+			case "4":
 			{
-				L2Npc golem = addSpawn(CHAOS_GOLEM, 94640, -112496, -3336, 0, false, 0);
-				_IsGolemSpawned = true;
-				startQuestTimer("6", 1000, golem, player);
-				player.sendPacket(new PlaySound(1, "Rm03_A", 0, 0, 0, 0, 0));
+				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(96055, -110759, -3312, 0));
+				startQuestTimer("5", 2000, npc, player);
+				break;
+			}
+			case "5":
+			{
+				player.teleToLocation(PLAYER_TELEPORT);
+				npc.teleToLocation(NPC_LOCATION);
+				if (!_IsGolemSpawned)
+				{
+					L2Npc golem = addSpawn(CHAOS_GOLEM, 94640, -112496, -3336, 0, false, 0);
+					_IsGolemSpawned = true;
+					startQuestTimer("6", 1000, golem, player);
+					player.sendPacket(new PlaySound(1, "Rm03_A", 0, 0, 0, 0, 0));
+				}
+				break;
+			}
+			case "6":
+			{
+				npc.broadcastPacket(new SpecialCamera(npc, 30, -200, 20, 6000, 700, 8000, 0, 0, 0, 0, 0));
+				break;
 			}
-		}
-		else if (event.equalsIgnoreCase("6"))
-		{
-			npc.broadcastPacket(new SpecialCamera(npc, 30, -200, 20, 6000, 700, 8000, 0, 0, 0, 0, 0));
 		}
 		return super.onAdvEvent(event, npc, player);
 	}

+ 0 - 7
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/EvasGiftBox.java

@@ -20,8 +20,6 @@ package ai.individual;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -46,11 +44,6 @@ public final class EvasGiftBox extends AbstractNpcAI
 		super(EvasGiftBox.class.getSimpleName(), "ai/individual");
 		addKillId(BOX);
 		addSpawnId(BOX);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(BOX))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override

+ 14 - 35
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/GraveRobbers.java

@@ -20,13 +20,9 @@ package ai.individual;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.holders.MinionHolder;
-import com.l2jserver.util.Rnd;
 
 /**
  * Grove Robber's AI.<br>
@@ -45,47 +41,30 @@ public final class GraveRobbers extends AbstractNpcAI
 	{
 		super(GraveRobbers.class.getSimpleName(), "ai/individual");
 		addSpawnId(GRAVE_ROBBER_SUMMONER, GRAVE_ROBBER_MEGICIAN);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(GRAVE_ROBBER_MEGICIAN))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (npc instanceof L2MonsterInstance)
+		if (getRandom(2) == 0)
 		{
-			if (!((L2MonsterInstance) npc).hasMinions())
-			{
-				L2NpcTemplate template = npc.getTemplate();
-				
-				if (Rnd.get(2) == 0)
-				{
-					if (template.getParameters().getMinionList("Privates1") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates1"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-				else
-				{
-					if (template.getParameters().getMinionList("Privates2") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates2"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-			}
+			spawnMinions(npc, "Privates1");
+		}
+		else
+		{
+			spawnMinions(npc, "Privates2");
 		}
 		return super.onSpawn(npc);
 	}
 	
+	private void spawnMinions(final L2Npc npc, final String spawnName)
+	{
+		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
+		{
+			addMinion((L2MonsterInstance) npc, is.getId());
+		}
+	}
+	
 	public static void main(String[] args)
 	{
 		new GraveRobbers();

+ 15 - 45
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/RagnaOrcCommander.java

@@ -20,14 +20,9 @@ package ai.individual;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.holders.MinionHolder;
-import com.l2jserver.util.Rnd;
 
 /**
  * Ragna Orc Commander AI.
@@ -41,56 +36,31 @@ public final class RagnaOrcCommander extends AbstractNpcAI
 	{
 		super(RagnaOrcCommander.class.getSimpleName(), "ai/individual");
 		addSpawnId(RAGNA_ORC_COMMANDER);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(RAGNA_ORC_COMMANDER))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (npc instanceof L2MonsterInstance)
+		spawnMinions(npc, "Privates1");
+		if (getRandom(100) < 50)
 		{
-			L2MonsterInstance monster = (L2MonsterInstance) npc;
-			if (!monster.hasMinions())
-			{
-				L2NpcTemplate template = NpcData.getInstance().getTemplate(RAGNA_ORC_COMMANDER);
-				
-				if (template.getParameters().getMinionList("Privates1") != null)
-				{
-					for (MinionHolder is : template.getParameters().getMinionList("Privates1"))
-					{
-						addMinion((L2MonsterInstance) npc, is.getId());
-					}
-				}
-				
-				if (Rnd.get(100) < 50)
-				{
-					if (template.getParameters().getMinionList("Privates2") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates1"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-				else
-				{
-					if (template.getParameters().getMinionList("Privates3") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates1"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-			}
+			spawnMinions(npc, "Privates2");
+		}
+		else
+		{
+			spawnMinions(npc, "Privates3");
 		}
 		return super.onSpawn(npc);
 	}
 	
+	private void spawnMinions(final L2Npc npc, final String spawnName)
+	{
+		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
+		{
+			addMinion((L2MonsterInstance) npc, is.getId());
+		}
+	}
+	
 	public static void main(String[] args)
 	{
 		new RagnaOrcCommander();

+ 14 - 39
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/RagnaOrcHero.java

@@ -20,14 +20,9 @@ package ai.individual;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.holders.MinionHolder;
-import com.l2jserver.util.Rnd;
 
 /**
  * Ragna Orc Hero AI.
@@ -41,50 +36,30 @@ public final class RagnaOrcHero extends AbstractNpcAI
 	{
 		super(RagnaOrcHero.class.getSimpleName(), "ai/individual");
 		addSpawnId(RAGNA_ORC_HERO);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(RAGNA_ORC_HERO))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (npc instanceof L2MonsterInstance)
+		if (getRandom(100) < 70)
 		{
-			L2MonsterInstance monster = (L2MonsterInstance) npc;
-			
-			if (!monster.hasMinions())
-			{
-				L2NpcTemplate template = NpcData.getInstance().getTemplate(RAGNA_ORC_HERO);
-				
-				if (Rnd.get(100) < 70)
-				{
-					if (template.getParameters().getMinionList("Privates1") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates1"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-				else
-				{
-					if (template.getParameters().getMinionList("Privates2") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates2"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-			}
+			spawnMinions(npc, "Privates1");
+		}
+		else
+		{
+			spawnMinions(npc, "Privates2");
 		}
-		
 		return super.onSpawn(npc);
 	}
 	
+	private void spawnMinions(final L2Npc npc, final String spawnName)
+	{
+		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
+		{
+			addMinion((L2MonsterInstance) npc, is.getId());
+		}
+	}
+	
 	public static void main(String[] args)
 	{
 		new RagnaOrcHero();

+ 15 - 37
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/RagnaOrcSeer.java

@@ -20,14 +20,9 @@ package ai.individual;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.holders.MinionHolder;
-import com.l2jserver.util.Rnd;
 
 /**
  * Ragna Orc Seer AI.
@@ -41,48 +36,31 @@ public final class RagnaOrcSeer extends AbstractNpcAI
 	{
 		super(RagnaOrcSeer.class.getSimpleName(), "ai/individual");
 		addSpawnId(RAGNA_ORC_SEER);
-		
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(RAGNA_ORC_SEER))
-		{
-			onSpawn(spawn.getLastSpawn());
-		}
 	}
 	
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (npc instanceof L2MonsterInstance)
+		
+		if (getRandom(100) < 50)
+		{
+			spawnMinions(npc, "Privates1");
+		}
+		else
 		{
-			L2MonsterInstance monster = (L2MonsterInstance) npc;
-			if (!monster.hasMinions())
-			{
-				L2NpcTemplate template = NpcData.getInstance().getTemplate(RAGNA_ORC_SEER);
-				
-				if (Rnd.get() < 50)
-				{
-					if (template.getParameters().getMinionList("Privates1") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates1"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-				else
-				{
-					if (template.getParameters().getMinionList("Privates2") != null)
-					{
-						for (MinionHolder is : template.getParameters().getMinionList("Privates2"))
-						{
-							addMinion((L2MonsterInstance) npc, is.getId());
-						}
-					}
-				}
-			}
+			spawnMinions(npc, "Privates2");
 		}
 		return super.onSpawn(npc);
 	}
 	
+	private void spawnMinions(final L2Npc npc, final String spawnName)
+	{
+		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
+		{
+			addMinion((L2MonsterInstance) npc, is.getId());
+		}
+	}
+	
 	public static void main(String[] args)
 	{
 		new RagnaOrcSeer();

+ 20 - 15
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Venom/Venom.java

@@ -24,7 +24,6 @@ import java.util.List;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager;
 import com.l2jserver.gameserver.model.Location;
@@ -106,7 +105,7 @@ public final class Venom extends AbstractNpcAI
 		addStartNpc(DUNGEON_KEEPER, TELEPORT_CUBE);
 		addFirstTalkId(DUNGEON_KEEPER, TELEPORT_CUBE);
 		addTalkId(DUNGEON_KEEPER, TELEPORT_CUBE);
-		addSpawnId(VENOM);
+		addSpawnId(VENOM, DUNGEON_KEEPER);
 		addSpellFinishedId(VENOM);
 		addAttackId(VENOM);
 		addKillId(VENOM);
@@ -261,32 +260,38 @@ public final class Venom extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
+		switch (npc.getId())
 		{
-			if ((_massymore == null) || (_venom == null))
+			case DUNGEON_KEEPER:
+			{
+				_massymore = npc;
+				break;
+			}
+			case VENOM:
 			{
-				_massymore = SpawnTable.getInstance().getFirstSpawn(DUNGEON_KEEPER).getLastSpawn();
-				_venom = SpawnTable.getInstance().getFirstSpawn(VENOM).getLastSpawn();
+				_venom = npc;
 				
 				_loc = _venom.getLocation();
 				_venom.disableSkill(VENOM_TELEPORT.getSkill(), -1);
 				_venom.disableSkill(RANGE_TELEPORT.getSkill(), -1);
 				_venom.doRevive();
+				broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.WHO_DARES_TO_COVET_THE_THRONE_OF_OUR_CASTLE_LEAVE_IMMEDIATELY_OR_YOU_WILL_PAY_THE_PRICE_OF_YOUR_AUDACITY_WITH_YOUR_VERY_OWN_BLOOD);
 				((L2Attackable) _venom).setCanReturnToSpawnPoint(false);
 				if (checkStatus() == DEAD)
 				{
 					_venom.deleteMe();
 				}
+				break;
 			}
-			if (checkStatus() == DEAD)
-			{
-				npc.deleteMe();
-			}
-			else
-			{
-				npc.doRevive();
-				broadcastNpcSay(npc, Say2.NPC_SHOUT, NpcStringId.WHO_DARES_TO_COVET_THE_THRONE_OF_OUR_CASTLE_LEAVE_IMMEDIATELY_OR_YOU_WILL_PAY_THE_PRICE_OF_YOUR_AUDACITY_WITH_YOUR_VERY_OWN_BLOOD);
-			}
+		}
+		if (checkStatus() == DEAD)
+		{
+			npc.deleteMe();
+		}
+		else
+		{
+			npc.doRevive();
+			
 		}
 		return super.onSpawn(npc);
 	}

+ 34 - 12
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java

@@ -18,6 +18,8 @@
  */
 package ai.npc.Minigame;
 
+import java.util.ArrayList;
+
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.datatables.SpawnTable;
@@ -56,7 +58,7 @@ public final class Minigame extends AbstractNpcAI
 	private static final int TIMER_INTERVAL = 3;
 	private static final int MAX_ATTEMPTS = 3;
 	
-	private final MinigameRoom _rooms[] = new MinigameRoom[2];
+	private final ArrayList<MinigameRoom> _rooms = new ArrayList<>(2);
 	
 	private Minigame()
 	{
@@ -64,13 +66,7 @@ public final class Minigame extends AbstractNpcAI
 		addStartNpc(SUMIEL);
 		addFirstTalkId(SUMIEL);
 		addTalkId(SUMIEL);
-		addSpawnId(TREASURE_BOX);
-		
-		int i = 0;
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(SUMIEL))
-		{
-			_rooms[i++] = initRoom(spawn.getLastSpawn());
-		}
+		addSpawnId(SUMIEL, TREASURE_BOX);
 	}
 	
 	@Override
@@ -246,8 +242,20 @@ public final class Minigame extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		npc.disableCoreAI(true);
-		startQuestTimer("afterthat", 180000, npc, null);
+		switch (npc.getId())
+		{
+			case SUMIEL:
+			{
+				_rooms.add(initRoom(npc));
+				break;
+			}
+			case TREASURE_BOX:
+			{
+				npc.disableCoreAI(true);
+				startQuestTimer("afterthat", 180000, npc, null);
+				break;
+			}
+		}
 		return super.onSpawn(npc);
 	}
 	
@@ -342,7 +350,14 @@ public final class Minigame extends AbstractNpcAI
 	 */
 	private MinigameRoom getRoomByManager(L2Npc manager)
 	{
-		return (_rooms[0].getManager() == manager) ? _rooms[0] : _rooms[1];
+		for (MinigameRoom room : _rooms)
+		{
+			if (room.getManager() == manager)
+			{
+				return room;
+			}
+		}
+		return null;
 	}
 	
 	/**
@@ -352,7 +367,14 @@ public final class Minigame extends AbstractNpcAI
 	 */
 	private MinigameRoom getRoomByParticipant(L2PcInstance participant)
 	{
-		return (_rooms[0].getParticipant() == participant) ? _rooms[0] : _rooms[1];
+		for (MinigameRoom room : _rooms)
+		{
+			if (room.getParticipant() == participant)
+			{
+				return room;
+			}
+		}
+		return null;
 	}
 	
 	/**

+ 3 - 12
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/TownPets/TownPets.java

@@ -22,8 +22,6 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-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.L2PcInstance;
@@ -54,14 +52,10 @@ public final class TownPets extends AbstractNpcAI
 	private TownPets()
 	{
 		super(TownPets.class.getSimpleName(), "ai/npc");
-		addSpawnId(PETS);
 		
-		for (int npcId : PETS)
+		if (Config.ALLOW_PET_WALKERS)
 		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				onSpawn(spawn.getLastSpawn());
-			}
+			addSpawnId(PETS);
 		}
 	}
 	
@@ -82,10 +76,7 @@ public final class TownPets extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (Config.ALLOW_PET_WALKERS)
-		{
-			startQuestTimer("move", 3000, npc, null);
-		}
+		startQuestTimer("move", 3000, npc, null);
 		return super.onSpawn(npc);
 	}
 	

+ 18 - 11
L2J_DataPack_BETA/dist/game/data/scripts/gracia/AI/NPC/GeneralDilios/GeneralDilios.java

@@ -18,11 +18,11 @@
  */
 package gracia.AI.NPC.GeneralDilios;
 
+import java.util.Collections;
 import java.util.Set;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -39,8 +39,8 @@ public final class GeneralDilios extends AbstractNpcAI
 	private static final int GENERAL_ID = 32549;
 	private static final int GUARD_ID = 32619;
 	
-	private L2Npc _general;
-	private final Set<L2Spawn> _guards;
+	private L2Npc _general = null;
+	private final Set<L2Spawn> _guards = Collections.emptySet();
 	
 	private static final NpcStringId[] diliosText =
 	{
@@ -57,14 +57,6 @@ public final class GeneralDilios extends AbstractNpcAI
 	public GeneralDilios()
 	{
 		super(GeneralDilios.class.getSimpleName(), "gracia/AI/NPC");
-		_general = SpawnTable.getInstance().getFirstSpawn(GENERAL_ID).getLastSpawn();
-		_guards = SpawnTable.getInstance().getSpawns(GUARD_ID);
-		if ((_general == null) || _guards.isEmpty())
-		{
-			_log.warning(GeneralDilios.class.getSimpleName() + ": Cannot find NPCs!");
-			return;
-		}
-		startQuestTimer("command_0", 60000, null, null);
 	}
 	
 	@Override
@@ -99,4 +91,19 @@ public final class GeneralDilios extends AbstractNpcAI
 		}
 		return super.onAdvEvent(event, npc, player);
 	}
+	
+	@Override
+	public String onSpawn(L2Npc npc)
+	{
+		if (npc.getId() == GENERAL_ID)
+		{
+			startQuestTimer("command_0", 60000, null, null);
+			_general = npc;
+		}
+		else if (npc.getId() == GUARD_ID)
+		{
+			_guards.add(npc.getSpawn());
+		}
+		return super.onSpawn(npc);
+	}
 }

+ 17 - 18
L2J_DataPack_BETA/dist/game/data/scripts/gracia/AI/NPC/ZealotOfShilen/ZealotOfShilen.java

@@ -21,8 +21,6 @@ package gracia.AI.NPC.ZealotOfShilen;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -46,27 +44,19 @@ public final class ZealotOfShilen extends AbstractNpcAI
 	{
 		super(ZealotOfShilen.class.getSimpleName(), "gracia/AI/NPC");
 		addSpawnId(ZEALOT);
+		addSpawnId(GUARDS);
 		addFirstTalkId(GUARDS);
-		
-		for (int npcId : GUARDS)
-		{
-			for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-			{
-				L2Npc guard = spawn.getLastSpawn();
-				guard.setIsInvul(true);
-				((L2Attackable) guard).setCanReturnToSpawnPoint(false);
-				startQuestTimer("WATCHING", 10000, guard, null, true);
-			}
-		}
-		for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(ZEALOT))
-		{
-			spawn.getLastSpawn().setIsNoRndWalk(true);
-		}
 	}
 	
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
+		if (npc == null)
+		{
+			return null;
+		}
+		
+		startQuestTimer("WATCHING", 10000, npc, null, true);
 		if (event.equalsIgnoreCase("WATCHING") && !npc.isAttackingNow())
 		{
 			for (L2Character character : npc.getKnownList().getKnownCharacters())
@@ -91,7 +81,16 @@ public final class ZealotOfShilen extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		npc.setIsNoRndWalk(true);
+		if (npc.getId() == ZEALOT)
+		{
+			npc.setIsNoRndWalk(true);
+		}
+		else
+		{
+			npc.setIsInvul(true);
+			((L2Attackable) npc).setCanReturnToSpawnPoint(false);
+			startQuestTimer("WATCHING", 10000, npc, null, true);
+		}
 		return super.onSpawn(npc);
 	}
 }

+ 0 - 22
L2J_DataPack_BETA/dist/game/data/scripts/gracia/AI/SeedOfAnnihilation/SeedOfAnnihilation.java

@@ -25,9 +25,7 @@ import javolution.util.FastMap;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.datatables.SkillData;
-import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
-import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -96,7 +94,6 @@ public class SeedOfAnnihilation extends AbstractNpcAI
 		}
 		addStartNpc(32739);
 		addTalkId(32739);
-		initialMinionsSpawn();
 		startEffectZonesControl();
 	}
 	
@@ -278,25 +275,6 @@ public class SeedOfAnnihilation extends AbstractNpcAI
 		startQuestTimer("ChangeSeedsStatus", _seedsNextStatusChange - System.currentTimeMillis(), null, null);
 	}
 	
-	private void initialMinionsSpawn()
-	{
-		L2MonsterInstance mob;
-		for (SeedRegion sr : _regionsData)
-		{
-			for (int npcId : sr.elite_mob_ids)
-			{
-				for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
-				{
-					mob = (L2MonsterInstance) spawn.getLastSpawn();
-					if (mob != null)
-					{
-						spawnGroupOfMinion(mob, sr.minion_lists[getRandom(sr.minion_lists.length)]);
-					}
-				}
-			}
-		}
-	}
-	
 	private void spawnGroupOfMinion(L2MonsterInstance npc, int[] mobIds)
 	{
 		for (int mobId : mobIds)

+ 4 - 0
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminAdmin.java

@@ -26,6 +26,7 @@ import javolution.text.TextBuilder;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.AdminTable;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Hero;
 import com.l2jserver.gameserver.model.olympiad.Olympiad;
@@ -70,6 +71,9 @@ public class AdminAdmin implements IAdminCommandHandler
 	@Override
 	public boolean useAdminCommand(String command, L2PcInstance activeChar)
 	{
+		L2MonsterInstance mon = (L2MonsterInstance) activeChar.getTarget();
+		
+		mon.teleToLocation(activeChar.getLocation());
 		if (command.startsWith("admin_admin"))
 		{
 			showMainPage(activeChar, command);

+ 1 - 4
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Amaskari.java

@@ -175,10 +175,7 @@ public final class Amaskari extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
-		{
-			startQuestTimer("onspawn_msg", (getRandom(3) + 1) * 30000, npc, null);
-		}
+		startQuestTimer("onspawn_msg", (getRandom(3) + 1) * 30000, npc, null);
 		return super.onSpawn(npc);
 	}
 }

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Chimeras.java

@@ -70,7 +70,7 @@ public final class Chimeras extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if ((HellboundEngine.getInstance().getLevel() == 7) && !npc.isTeleporting()) // Have random spawn points only in 7 lvl
+		if (HellboundEngine.getInstance().getLevel() == 7) // Have random spawn points only in 7 lvl
 		{
 			final Location loc = LOCATIONS[getRandom(LOCATIONS.length)];
 			if (!npc.isInsideRadius(loc, 200, false, false))

+ 4 - 7
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Keltas.java

@@ -179,13 +179,10 @@ public final class Keltas extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
-		{
-			_spawnedKeltas = (L2MonsterInstance) npc;
-			broadcastNpcSay(_spawnedKeltas, Say2.NPC_SHOUT, NpcStringId.GUYS_SHOW_THEM_OUR_POWER);
-			spawnMinions();
-			startQuestTimer("despawn", 1800000, null, null);
-		}
+		_spawnedKeltas = (L2MonsterInstance) npc;
+		broadcastNpcSay(_spawnedKeltas, Say2.NPC_SHOUT, NpcStringId.GUYS_SHOW_THEM_OUR_POWER);
+		spawnMinions();
+		startQuestTimer("despawn", 1800000, null, null);
 		return super.onSpawn(npc);
 	}
 }

+ 1 - 4
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/NPC/Shadai/Shadai.java

@@ -72,10 +72,7 @@ public final class Shadai extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
-		{
-			startQuestTimer("VALIDATE_POS", 60000, npc, null, true);
-		}
+		startQuestTimer("VALIDATE_POS", 60000, npc, null, true);
 		return super.onSpawn(npc);
 	}
 }

+ 1 - 4
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Typhoon.java

@@ -71,10 +71,7 @@ public final class Typhoon extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
-		{
-			startQuestTimer("CAST", 5000, npc, null);
-		}
+		startQuestTimer("CAST", 5000, npc, null);
 		return super.onSpawn(npc);
 	}
 }

+ 30 - 34
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Zones/AnomicFoundry/AnomicFoundry.java

@@ -80,12 +80,9 @@ public final class AnomicFoundry extends AbstractNpcAI
 		super(AnomicFoundry.class.getSimpleName(), "hellbound/AI/Zones");
 		addAggroRangeEnterId(LABORER);
 		addAttackId(LABORER);
-		addKillId(LABORER);
-		addKillId(LESSER_EVIL);
-		addKillId(GREATER_EVIL);
-		addSpawnId(LABORER);
-		addSpawnId(LESSER_EVIL);
-		addSpawnId(GREATER_EVIL);
+		addKillId(LABORER, LESSER_EVIL, GREATER_EVIL);
+		addSpawnId(LABORER, LESSER_EVIL, GREATER_EVIL);
+		addTeleportId(LABORER, LESSER_EVIL, GREATER_EVIL);
 		startQuestTimer("make_spawn_1", respawnTime, null, null);
 	}
 	
@@ -205,40 +202,39 @@ public final class AnomicFoundry extends AbstractNpcAI
 	@Override
 	public final String onSpawn(L2Npc npc)
 	{
-		if (!npc.isTeleporting())
+		SpawnTable.getInstance().addNewSpawn(npc.getSpawn(), false);
+		if (getSpawnGroup(npc) >= 0)
 		{
-			SpawnTable.getInstance().addNewSpawn(npc.getSpawn(), false);
-			if (getSpawnGroup(npc) >= 0)
-			{
-				_spawned[getSpawnGroup(npc)]++;
-			}
-			
-			if (npc.getId() == LABORER)
-			{
-				npc.setIsNoRndWalk(true);
-			}
+			_spawned[getSpawnGroup(npc)]++;
 		}
-		else
+		
+		if (npc.getId() == LABORER)
 		{
-			if ((getSpawnGroup(npc) >= 0) && (getSpawnGroup(npc) <= 2))
-			{
-				_spawned[getSpawnGroup(npc)]--;
-				SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
-				npc.scheduleDespawn(100);
-				if (_spawned[3] < SPAWNS[3][5])
-				{
-					addSpawn(SPAWNS[3][0], SPAWNS[3][1], SPAWNS[3][2], SPAWNS[3][3], SPAWNS[3][4], false, 0, false);
-				}
-			}
-			else if (getSpawnGroup(npc) == 3)
+			npc.setIsNoRndWalk(true);
+		}
+		return super.onSpawn(npc);
+	}
+	
+	@Override
+	protected void onTeleport(L2Npc npc)
+	{
+		if ((getSpawnGroup(npc) >= 0) && (getSpawnGroup(npc) <= 2))
+		{
+			_spawned[getSpawnGroup(npc)]--;
+			SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
+			npc.scheduleDespawn(100);
+			if (_spawned[3] < SPAWNS[3][5])
 			{
-				startQuestTimer("make_spawn_2", respawnTime * 2, null, null);
-				_spawned[3]--;
-				SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
-				npc.scheduleDespawn(100);
+				addSpawn(SPAWNS[3][0], SPAWNS[3][1], SPAWNS[3][2], SPAWNS[3][3], SPAWNS[3][4], false, 0, false);
 			}
 		}
-		return super.onSpawn(npc);
+		else if (getSpawnGroup(npc) == 3)
+		{
+			startQuestTimer("make_spawn_2", respawnTime * 2, null, null);
+			_spawned[3]--;
+			SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
+			npc.scheduleDespawn(100);
+		}
 	}
 	
 	private static int getSpawnGroup(L2Npc npc)

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AI/Zones/TowerOfNaia/TowerOfNaia.java

@@ -760,7 +760,7 @@ public final class TowerOfNaia extends AbstractNpcAI
 	{
 		final int npcId = npc.getId();
 		
-		if ((npcId == MUTATED_ELPY) && !npc.isTeleporting())
+		if (npcId == MUTATED_ELPY)
 		{
 			DoorTable.getInstance().getDoor(18250025).openMe();
 			ZoneManager.getInstance().getZoneById(200100).setEnabled(false);

+ 8 - 2
L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00457_LostAndFound/Q00457_LostAndFound.java

@@ -60,11 +60,10 @@ public final class Q00457_LostAndFound extends Quest
 	{
 		super(457, Q00457_LostAndFound.class.getSimpleName(), "Lost and Found");
 		addStartNpc(GUMIEL);
+		addSpawnId(ESCORT_CHECKER);
 		addFirstTalkId(GUMIEL);
 		addTalkId(GUMIEL);
 		addKillId(SOLINA_CLAN);
-		
-		_escortCheckers = SpawnTable.getInstance().getSpawns(ESCORT_CHECKER);
 	}
 	
 	@Override
@@ -238,6 +237,13 @@ public final class Q00457_LostAndFound extends Quest
 		return htmltext;
 	}
 	
+	@Override
+	public String onSpawn(L2Npc npc)
+	{
+		_escortCheckers = SpawnTable.getInstance().getSpawns(ESCORT_CHECKER);
+		return super.onSpawn(npc);
+	}
+	
 	public void broadcastNpcSay(L2Npc npc, L2PcInstance player, NpcStringId stringId, boolean whisper)
 	{
 		((whisper) ? player : npc).sendPacket(new NpcSay(npc.getObjectId(), ((whisper) ? Say2.TELL : Say2.ALL), npc.getId(), stringId));