From 4ef99badf89d27b3ec119951090f98f8408f491b Mon Sep 17 00:00:00 2001
From: St3eT <St3eT@users.noreply.github.com>
Date: Thu, 16 Jan 2014 20:16:33 +0000
Subject: [PATCH] BETA: Reworking '''Antharas''' AI. * Tested by: St3eT,
 malyelfik * Thanks to: malyelfik, FBIagent, xban1x * Reviewed by: malyelfik,
 !UnAfraid, Adry_85, Zoey76, xban1x

---
 .../dist/game/config/adminCommands.xml        |    7 +
 .../dist/game/data/html/admin/grandboss.htm   |   32 +
 .../data/html/admin/grandboss_antharas.htm    |   36 +
 .../game/data/html/admin/grandboss_baium.htm  |   28 +
 .../game/data/html/admin/grandboss_core.htm   |   27 +
 .../game/data/html/admin/grandboss_orfen.htm  |   30 +
 .../data/html/admin/grandboss_queenant.htm    |   28 +
 .../data/html/admin/grandboss_valakas.htm     |   29 +
 .../dist/game/data/html/default/31859.htm     |    5 +-
 L2J_DataPack_BETA/dist/game/data/scripts.cfg  |    2 +-
 .../data/scripts/ai/individual/Antharas.java  |  956 ---------------
 .../ai/individual/Antharas/13001-01.html      |    8 +
 .../ai/individual/Antharas/13001-02.html      |    6 +
 .../ai/individual/Antharas/13001-03.html      |    6 +
 .../ai/individual/Antharas/13001-04.html      |    6 +
 .../ai/individual/Antharas/13001-05.html      |    6 +
 .../scripts/ai/individual/Antharas/13001.html |   12 +
 .../ai/individual/Antharas/Antharas.java      | 1055 +++++++++++++++++
 .../GrandBossTeleporters/13001-01.htm         |    3 -
 .../GrandBossTeleporters/13001-02.htm         |    3 -
 .../GrandBossTeleporters/13001-03.htm         |    3 -
 .../GrandBossTeleporters.java                 |   61 -
 .../data/scripts/handlers/MasterHandler.java  |    2 +
 .../admincommandhandlers/AdminGrandBoss.java  |  380 ++++++
 .../dist/game/data/zones/custom_boss.xml      |    7 -
 .../dist/game/data/zones/no_restart.xml       |    2 +-
 .../dist/sql/game/grandboss_data.sql          |    4 +-
 .../dist/sql/game/herb_droplist_groups.sql    |    8 +-
 L2J_DataPack_BETA/dist/sql/game/npc.sql       |    6 +-
 L2J_DataPack_BETA/dist/sql/game/npcaidata.sql |    2 +-
 L2J_DataPack_BETA/dist/sql/game/npcskills.sql |    1 +
 .../dist/sql/game/updates/20140116update.sql  |    2 +
 32 files changed, 1719 insertions(+), 1044 deletions(-)
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_antharas.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_baium.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_core.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_orfen.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_queenant.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_valakas.htm
 delete mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas.java
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-01.html
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-02.html
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-03.html
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-04.html
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-05.html
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001.html
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/Antharas.java
 delete mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-01.htm
 delete mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-02.htm
 delete mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-03.htm
 create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminGrandBoss.java
 create mode 100644 L2J_DataPack_BETA/dist/sql/game/updates/20140116update.sql

diff --git a/L2J_DataPack_BETA/dist/game/config/adminCommands.xml b/L2J_DataPack_BETA/dist/game/config/adminCommands.xml
index 1b08671f7b..111eb73936 100644
--- a/L2J_DataPack_BETA/dist/game/config/adminCommands.xml
+++ b/L2J_DataPack_BETA/dist/game/config/adminCommands.xml
@@ -313,6 +313,13 @@
 	<admin command="admin_kill_tiat" accessLevel="7" />
 	<admin command="admin_set_sodstate" accessLevel="7" />
 
+	<!-- ADMIN GRAND BOSS -->
+	<admin command="admin_grandboss" accessLevel="7" />
+	<admin command="admin_grandboss_skip" accessLevel="7" />
+	<admin command="admin_grandboss_respawn" accessLevel="7" />
+	<admin command="admin_grandboss_minions" accessLevel="7" />
+	<admin command="admin_grandboss_abort" accessLevel="7" />
+	
 	<!-- ADMIN HEAL -->
 	<admin command="admin_heal" accessLevel="7" />
 
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss.htm
new file mode 100644
index 0000000000..ce2e41d673
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss.htm
@@ -0,0 +1,32 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+	<center>
+		<table width="270" border="0" bgcolor="444444">
+			<tr>
+				<td>
+					<button value="Main" action="bypass -h admin_admin" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+				<td>
+					<button value="Char" action="bypass -h admin_admin6" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+				<td>
+					<button value="Game" action="bypass -h admin_admin2" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+				<td>
+					<button value="GM" action="bypass -h admin_admin7" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+			</tr>
+		</table>
+		<br>
+		<font color="LEVEL">GrandBoss admin menu</font><br>
+	</center>
+<br>
+<br>
+<button value="Antharas" action="bypass -h admin_grandboss 29068" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
+<button value="Valakas" action="bypass -h admin_grandboss 29028" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
+<button value="Baium" action="bypass -h admin_grandboss 29020" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
+<button value="Queen Ant" action="bypass -h admin_grandboss 29001" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
+<button value="Orfen" action="bypass -h admin_grandboss 29014" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
+<button value="Core" action="bypass -h admin_grandboss 29006" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_antharas.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_antharas.htm
new file mode 100644
index 0000000000..282b25011c
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_antharas.htm
@@ -0,0 +1,36 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+<table width=270>
+<tr>
+<td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td width=180><center>Admin GrandBoss menu</center></td>
+<td width=45><button value="Back" action="bypass -h admin_grandboss" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
+<br>
+<font color="LEVEL">Antharas<font><br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Status:</td>
+			<td><font color="%bossColor%">%bossStatus%</font></td>
+		</tr>
+		<tr>
+			<td>Respawn time:</td>
+			<td>%respawnTime%</td>
+		</tr>
+		<tr>
+			<td>Players inside:</td>
+			<td>%playersInside%</td>
+		</tr>
+	</table>
+<br>
+<br>
+<button value="Respawn Antharas" action="bypass -h admin_grandboss_respawn 29068" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Skip waiting time" action="bypass -h admin_grandboss_skip 29068" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Despawn all minions" action="bypass -h admin_grandboss_minions 29068" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Abort Fight" action="bypass -h admin_grandboss_abort 29068" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Heart of Warding" action="bypass -h admin_move_to 154525 121152 -3809" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Antharas Nest" action="bypass -h admin_move_to 179786 114872 -7708" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_baium.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_baium.htm
new file mode 100644
index 0000000000..a58056c38c
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_baium.htm
@@ -0,0 +1,28 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+<table width=270>
+<tr>
+<td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td width=180><center>Admin GrandBoss menu</center></td>
+<td width=45><button value="Back" action="bypass -h admin_grandboss" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
+<br>
+<font color="LEVEL">Baium<font><br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Status:</td>
+			<td><font color="%bossColor%">%bossStatus%</font></td>
+		</tr>
+		<tr>
+			<td>Respawn time:</td>
+			<td>%respawnTime%</td>
+		</tr>
+	</table>
+<br>
+<br>
+<button value="Teleport to Angelic Vortex" action="bypass -h admin_move_to 112683 14101 10077" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Baium Nest" action="bypass -h admin_move_to 115199 16621 10077" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_core.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_core.htm
new file mode 100644
index 0000000000..eed9612116
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_core.htm
@@ -0,0 +1,27 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+<table width=270>
+<tr>
+<td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td width=180><center>Admin GrandBoss menu</center></td>
+<td width=45><button value="Back" action="bypass -h admin_grandboss" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
+<br>
+<font color="LEVEL">Core<font><br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Status:</td>
+			<td><font color="%bossColor%">%bossStatus%</font></td>
+		</tr>
+		<tr>
+			<td>Respawn time:</td>
+			<td>%respawnTime%</td>
+		</tr>
+	</table>
+<br>
+<br>
+<button value="Teleport to Core" action="bypass -h admin_move_to 17725 109550 -6488" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_orfen.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_orfen.htm
new file mode 100644
index 0000000000..e84ebe87cc
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_orfen.htm
@@ -0,0 +1,30 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+<table width=270>
+<tr>
+<td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td width=180><center>Admin GrandBoss menu</center></td>
+<td width=45><button value="Back" action="bypass -h admin_grandboss" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
+<br>
+<font color="LEVEL">Orfen<font><br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Status:</td>
+			<td><font color="%bossColor%">%bossStatus%</font></td>
+		</tr>
+		<tr>
+			<td>Respawn time:</td>
+			<td>%respawnTime%</td>
+		</tr>
+	</table>
+<br>
+<br>
+<button value="Teleport to Orfen loc 1" action="bypass -h admin_move_to 43728 17220 -4342" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Orfen loc 2" action="bypass -h admin_move_to 55024 17368 -5412" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Orfen loc 3" action="bypass -h admin_move_to 53504 21248 -5486" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Orfen loc 4" action="bypass -h admin_move_to 53248 24576 -5262" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_queenant.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_queenant.htm
new file mode 100644
index 0000000000..d12f2ee08c
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_queenant.htm
@@ -0,0 +1,28 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+<table width=270>
+<tr>
+<td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td width=180><center>Admin GrandBoss menu</center></td>
+<td width=45><button value="Back" action="bypass -h admin_grandboss" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
+<br>
+<font color="LEVEL">Queen ant<font><br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Status:</td>
+			<td><font color="%bossColor%">%bossStatus%</font></td>
+		</tr>
+		<tr>
+			<td>Respawn time:</td>
+			<td>%respawnTime%</td>
+		</tr>
+	</table>
+<br>
+<br>
+<button value="Teleport to Queen Ant" action="bypass -h admin_move_to -21568 181764 -5722" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Queen Ant Larva" action="bypass -h admin_move_to -21598 179595 -5834" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_valakas.htm b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_valakas.htm
new file mode 100644
index 0000000000..df08f36ac2
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/html/admin/grandboss_valakas.htm
@@ -0,0 +1,29 @@
+<html><title>Admin GrandBoss</title><body>
+<center>
+<table width=270>
+<tr>
+<td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+<td width=180><center>Admin GrandBoss menu</center></td>
+<td width=45><button value="Back" action="bypass -h admin_grandboss" width=45 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
+<br>
+<font color="LEVEL">Valakas<font><br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Status:</td>
+			<td><font color="%bossColor%">%bossStatus%</font></td>
+		</tr>
+		<tr>
+			<td>Respawn time:</td>
+			<td>%respawnTime%</td>
+		</tr>
+	</table>
+<br>
+<br>
+<button value="Teleport to Klein" action="bypass -h admin_move_to 183632 -114891 -3337" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Heart of Volcano" action="bypass -h admin_move_to 189865 -105364 -786" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+<button value="Teleport to Valakas Nest" action="bypass -h admin_move_to 213896 -115436 -1644" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
+</center>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/html/default/31859.htm b/L2J_DataPack_BETA/dist/game/data/html/default/31859.htm
index d2dcb771ce..8b148fd79b 100644
--- a/L2J_DataPack_BETA/dist/game/data/html/default/31859.htm
+++ b/L2J_DataPack_BETA/dist/game/data/html/default/31859.htm
@@ -1,3 +1,4 @@
-<html><body>Teleport Cube:<br><br>
-<a action="bypass -h npc_%objectId%_Quest GrandBossTeleporters">Go to Giran Castle Town</a>
+<html><body>Teleportation Cubic:<br>
+<a action="bypass -h npc_%objectId%_Quest Antharas teleportOut">Go to Giran.</a><br>
+<a action="bypass -h npc_%objectId%_Quest">Quest.</a>
 </body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts.cfg b/L2J_DataPack_BETA/dist/game/data/scripts.cfg
index f58a924e96..6aaab465e5 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts.cfg
+++ b/L2J_DataPack_BETA/dist/game/data/scripts.cfg
@@ -125,11 +125,11 @@ ai/group_template/VarkaKetra.java
 ai/group_template/WarriorFishingBlock.java
 
 # Individual
+ai/individual/Antharas/Antharas.java
 ai/individual/Sailren/Sailren.java
 ai/individual/Venom/Venom.java
 ai/individual/Amaskari.java
 ai/individual/Anais.java
-ai/individual/Antharas.java
 ai/individual/Baium.java
 ai/individual/Beleth.java
 ai/individual/CatsEyeBandit.java
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas.java
deleted file mode 100644
index 1535ba3b87..0000000000
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas.java
+++ /dev/null
@@ -1,956 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J DataPack
- * 
- * This file is part of L2J DataPack.
- * 
- * L2J DataPack is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J DataPack is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package ai.individual;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ScheduledFuture;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-import ai.npc.AbstractNpcAI;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.GeoData;
-import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.ai.CtrlIntention;
-import com.l2jserver.gameserver.datatables.NpcTable;
-import com.l2jserver.gameserver.datatables.SkillTable;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.instancemanager.GrandBossManager;
-import com.l2jserver.gameserver.model.L2Spawn;
-import com.l2jserver.gameserver.model.L2World;
-import com.l2jserver.gameserver.model.Location;
-import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.zone.type.L2BossZone;
-import com.l2jserver.gameserver.network.serverpackets.Earthquake;
-import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
-import com.l2jserver.gameserver.network.serverpackets.PlaySound;
-import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
-
-/**
- * Antharas' AI.
- * @author L2J_JP SANDMAN
- */
-public final class Antharas extends AbstractNpcAI
-{
-	// config
-	private static final int FWA_ACTIVITYTIMEOFANTHARAS = 120;
-	// private static final int FWA_APPTIMEOFANTHARAS = 1800000;
-	private static final int FWA_INACTIVITYTIME = 900000;
-	private static final boolean FWA_OLDANTHARAS = false;
-	private static final boolean FWA_MOVEATRANDOM = true;
-	private static final boolean FWA_DOSERVEREARTHQUAKE = true;
-	private static final int FWA_LIMITOFWEAK = 45;
-	private static final int FWA_LIMITOFNORMAL = 63;
-	private static final int FWA_MAXMOBS = 10; // this includes Antharas itself
-	private static final int FWA_INTERVALOFMOBSWEAK = 180000;
-	private static final int FWA_INTERVALOFMOBSNORMAL = 150000;
-	private static final int FWA_INTERVALOFMOBSSTRONG = 120000;
-	private static final int FWA_PERCENTOFBEHEMOTH = 60;
-	private static final int FWA_SELFDESTRUCTTIME = 15000;
-	// Location of teleport cube.
-	private final int _teleportCubeId = 31859;
-	private final int _teleportCubeLocation[][] =
-	{
-		{
-			177615,
-			114941,
-			-7709,
-			0
-		}
-	};
-	
-	protected List<L2Spawn> _teleportCubeSpawn = new FastList<>();
-	protected List<L2Npc> _teleportCube = new FastList<>();
-	// Spawn data of monsters.
-	protected Map<Integer, L2Spawn> _monsterSpawn = new FastMap<>();
-	// Instance of monsters.
-	protected List<L2Npc> _monsters = new FastList<>();
-	protected L2GrandBossInstance _antharas = null;
-	// Antharas Ids
-	private static final int ANTHARAS_OLD_ID = 29019;
-	private static final int ANTHARAS_WEAK_ID = 29066;
-	private static final int ANTHARAS_NORMAL_ID = 29067;
-	private static final int ANTHARAS_STRONG_ID = 29068;
-	// Tasks.
-	protected ScheduledFuture<?> _cubeSpawnTask = null;
-	protected ScheduledFuture<?> _monsterSpawnTask = null;
-	protected ScheduledFuture<?> _activityCheckTask = null;
-	protected ScheduledFuture<?> _socialTask = null;
-	protected ScheduledFuture<?> _mobiliseTask = null;
-	protected ScheduledFuture<?> _mobsSpawnTask = null;
-	protected ScheduledFuture<?> _selfDestructionTask = null;
-	protected ScheduledFuture<?> _moveAtRandomTask = null;
-	protected ScheduledFuture<?> _movieTask = null;
-	// Antharas Status Tracking :
-	private static final byte DORMANT = 0; // Antharas is spawned and no one has entered yet. Entry is unlocked
-	private static final byte WAITING = 1; // Antharas is spawend and someone has entered, triggering a 30 minute window for additional people to enter
-	// before he unleashes his attack. Entry is unlocked
-	private static final byte FIGHTING = 2; // Antharas is engaged in battle, annihilating his foes. Entry is locked
-	private static final byte DEAD = 3; // Antharas has been killed. Entry is locked
-	
-	protected static long _LastAction = 0;
-	
-	protected static L2BossZone _Zone;
-	
-	private Antharas()
-	{
-		super(Antharas.class.getSimpleName(), "ai/individual");
-		registerMobs(ANTHARAS_OLD_ID, ANTHARAS_WEAK_ID, ANTHARAS_NORMAL_ID, ANTHARAS_STRONG_ID, 29069, 29070, 29071, 29072, 29073, 29074, 29075, 29076);
-		init();
-	}
-	
-	// Initialize
-	private void init()
-	{
-		// Setting spawn data of monsters.
-		try
-		{
-			_Zone = GrandBossManager.getInstance().getZone(179700, 113800, -7709);
-			// Old Antharas
-			L2NpcTemplate template1 = NpcTable.getInstance().getTemplate(ANTHARAS_OLD_ID);
-			L2Spawn tempSpawn = new L2Spawn(template1);
-			tempSpawn.setX(181323);
-			tempSpawn.setY(114850);
-			tempSpawn.setZ(-7623);
-			tempSpawn.setHeading(32542);
-			tempSpawn.setAmount(1);
-			tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
-			SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
-			_monsterSpawn.put(29019, tempSpawn);
-			
-			// Weak Antharas
-			template1 = NpcTable.getInstance().getTemplate(ANTHARAS_WEAK_ID);
-			tempSpawn = new L2Spawn(template1);
-			tempSpawn.setX(181323);
-			tempSpawn.setY(114850);
-			tempSpawn.setZ(-7623);
-			tempSpawn.setHeading(32542);
-			tempSpawn.setAmount(1);
-			tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
-			SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
-			_monsterSpawn.put(29066, tempSpawn);
-			
-			// Normal Antharas
-			template1 = NpcTable.getInstance().getTemplate(ANTHARAS_NORMAL_ID);
-			tempSpawn = new L2Spawn(template1);
-			tempSpawn.setX(181323);
-			tempSpawn.setY(114850);
-			tempSpawn.setZ(-7623);
-			tempSpawn.setHeading(32542);
-			tempSpawn.setAmount(1);
-			tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
-			SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
-			_monsterSpawn.put(29067, tempSpawn);
-			
-			// Strong Antharas
-			template1 = NpcTable.getInstance().getTemplate(ANTHARAS_STRONG_ID);
-			tempSpawn = new L2Spawn(template1);
-			tempSpawn.setX(181323);
-			tempSpawn.setY(114850);
-			tempSpawn.setZ(-7623);
-			tempSpawn.setHeading(32542);
-			tempSpawn.setAmount(1);
-			tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
-			SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
-			_monsterSpawn.put(29068, tempSpawn);
-		}
-		catch (Exception e)
-		{
-			_log.warning(e.getMessage());
-		}
-		
-		// Setting spawn data of teleport cube.
-		try
-		{
-			L2NpcTemplate Cube = NpcTable.getInstance().getTemplate(_teleportCubeId);
-			L2Spawn spawnDat;
-			for (int[] element : _teleportCubeLocation)
-			{
-				spawnDat = new L2Spawn(Cube);
-				spawnDat.setAmount(1);
-				spawnDat.setX(element[0]);
-				spawnDat.setY(element[1]);
-				spawnDat.setZ(element[2]);
-				spawnDat.setHeading(element[3]);
-				spawnDat.setRespawnDelay(60);
-				spawnDat.setLocationId(0);
-				SpawnTable.getInstance().addNewSpawn(spawnDat, false);
-				_teleportCubeSpawn.add(spawnDat);
-			}
-		}
-		catch (Exception e)
-		{
-			_log.warning(e.getMessage());
-		}
-		int status = GrandBossManager.getInstance().getBossStatus(ANTHARAS_OLD_ID);
-		if (FWA_OLDANTHARAS || (status == WAITING))
-		{
-			StatsSet info = GrandBossManager.getInstance().getStatsSet(ANTHARAS_OLD_ID);
-			Long respawnTime = info.getLong("respawn_time");
-			if ((status == DEAD) && (respawnTime <= System.currentTimeMillis()))
-			{
-				// the time has already expired while the server was offline. Immediately spawn antharas in his cave.
-				// also, the status needs to be changed to DORMANT
-				GrandBossManager.getInstance().setBossStatus(ANTHARAS_OLD_ID, DORMANT);
-				status = DORMANT;
-			}
-			else if (status == FIGHTING)
-			{
-				int loc_x = info.getInt("loc_x");
-				int loc_y = info.getInt("loc_y");
-				int loc_z = info.getInt("loc_z");
-				int heading = info.getInt("heading");
-				int hp = info.getInt("currentHP");
-				int mp = info.getInt("currentMP");
-				_antharas = (L2GrandBossInstance) addSpawn(ANTHARAS_OLD_ID, loc_x, loc_y, loc_z, heading, false, 0);
-				GrandBossManager.getInstance().addBoss(_antharas);
-				_antharas.setCurrentHpMp(hp, mp);
-				_LastAction = System.currentTimeMillis();
-				// Start repeating timer to check for inactivity
-				_activityCheckTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckActivity(), 60000, 60000);
-			}
-			else if (status == DEAD)
-			{
-				ThreadPoolManager.getInstance().scheduleGeneral(new UnlockAntharas(ANTHARAS_OLD_ID), respawnTime - System.currentTimeMillis());
-			}
-			else
-			{
-				setAntharasSpawnTask();
-			}
-		}
-		else
-		{
-			int statusWeak = GrandBossManager.getInstance().getBossStatus(ANTHARAS_WEAK_ID);
-			int statusNormal = GrandBossManager.getInstance().getBossStatus(ANTHARAS_NORMAL_ID);
-			int statusStrong = GrandBossManager.getInstance().getBossStatus(ANTHARAS_STRONG_ID);
-			int antharasId = 0;
-			if ((statusWeak == FIGHTING) || (statusWeak == DEAD))
-			{
-				antharasId = ANTHARAS_WEAK_ID;
-				status = statusWeak;
-			}
-			else if ((statusNormal == FIGHTING) || (statusNormal == DEAD))
-			{
-				antharasId = ANTHARAS_NORMAL_ID;
-				status = statusNormal;
-			}
-			else if ((statusStrong == FIGHTING) || (statusStrong == DEAD))
-			{
-				antharasId = ANTHARAS_STRONG_ID;
-				status = statusStrong;
-			}
-			if ((antharasId != 0) && (status == FIGHTING))
-			{
-				StatsSet info = GrandBossManager.getInstance().getStatsSet(antharasId);
-				int loc_x = info.getInt("loc_x");
-				int loc_y = info.getInt("loc_y");
-				int loc_z = info.getInt("loc_z");
-				int heading = info.getInt("heading");
-				int hp = info.getInt("currentHP");
-				int mp = info.getInt("currentMP");
-				_antharas = (L2GrandBossInstance) addSpawn(antharasId, loc_x, loc_y, loc_z, heading, false, 0);
-				GrandBossManager.getInstance().addBoss(_antharas);
-				_antharas.setCurrentHpMp(hp, mp);
-				_LastAction = System.currentTimeMillis();
-				// Start repeating timer to check for inactivity
-				_activityCheckTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckActivity(), 60000, 60000);
-			}
-			else if ((antharasId != 0) && (status == DEAD))
-			{
-				StatsSet info = GrandBossManager.getInstance().getStatsSet(antharasId);
-				Long respawnTime = info.getLong("respawn_time");
-				if (respawnTime <= System.currentTimeMillis())
-				{
-					// the time has already expired while the server was offline. Immediately spawn antharas in his cave.
-					// also, the status needs to be changed to DORMANT
-					GrandBossManager.getInstance().setBossStatus(antharasId, DORMANT);
-					status = DORMANT;
-				}
-				else
-				{
-					ThreadPoolManager.getInstance().scheduleGeneral(new UnlockAntharas(antharasId), respawnTime - System.currentTimeMillis());
-				}
-			}
-		}
-	}
-	
-	// Do spawn teleport cube.
-	public void spawnCube()
-	{
-		if (_mobsSpawnTask != null)
-		{
-			_mobsSpawnTask.cancel(true);
-			_mobsSpawnTask = null;
-		}
-		if (_selfDestructionTask != null)
-		{
-			_selfDestructionTask.cancel(true);
-			_selfDestructionTask = null;
-		}
-		if (_activityCheckTask != null)
-		{
-			_activityCheckTask.cancel(false);
-			_activityCheckTask = null;
-		}
-		
-		for (L2Spawn spawnDat : _teleportCubeSpawn)
-		{
-			_teleportCube.add(spawnDat.doSpawn());
-		}
-	}
-	
-	// Setting Antharas spawn task.
-	public void setAntharasSpawnTask()
-	{
-		if (_monsterSpawnTask == null)
-		{
-			synchronized (this)
-			{
-				if (_monsterSpawnTask == null)
-				{
-					GrandBossManager.getInstance().setBossStatus(ANTHARAS_OLD_ID, WAITING);
-					_monsterSpawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(1), (Config.ANTHARAS_WAIT_TIME * 60000));
-				}
-			}
-		}
-	}
-	
-	@Override
-	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
-	{
-		if (event.equalsIgnoreCase("waiting"))
-		{
-			setAntharasSpawnTask();
-		}
-		
-		return super.onAdvEvent(event, npc, player);
-	}
-	
-	protected void startMinionSpawns(int antharasId)
-	{
-		int intervalOfMobs;
-		
-		// Interval of minions is decided by the type of Antharas
-		// that invaded the lair.
-		switch (antharasId)
-		{
-			case ANTHARAS_WEAK_ID:
-				intervalOfMobs = FWA_INTERVALOFMOBSWEAK;
-				break;
-			case ANTHARAS_NORMAL_ID:
-				intervalOfMobs = FWA_INTERVALOFMOBSNORMAL;
-				break;
-			default:
-				intervalOfMobs = FWA_INTERVALOFMOBSSTRONG;
-				break;
-		}
-		
-		// Spawn mobs.
-		_mobsSpawnTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new MobsSpawn(), intervalOfMobs, intervalOfMobs);
-	}
-	
-	// Do spawn Antharas.
-	private class AntharasSpawn implements Runnable
-	{
-		private int _taskId = 0;
-		private final Collection<L2Character> _players = _Zone.getCharactersInside();
-		
-		public AntharasSpawn(int taskId)
-		{
-			_taskId = taskId;
-		}
-		
-		@Override
-		public void run()
-		{
-			int npcId;
-			L2Spawn antharasSpawn = null;
-			
-			switch (_taskId)
-			{
-				case 1: // Spawn.
-					// Strength of Antharas is decided by the number of players that
-					// invaded the lair.
-					_monsterSpawnTask.cancel(false);
-					_monsterSpawnTask = null;
-					if (FWA_OLDANTHARAS)
-					{
-						npcId = 29019; // old
-					}
-					else if (_players.size() <= FWA_LIMITOFWEAK)
-					{
-						npcId = 29066; // weak
-					}
-					else if (_players.size() > FWA_LIMITOFNORMAL)
-					{
-						npcId = 29068; // strong
-					}
-					else
-					{
-						npcId = 29067; // normal
-					}
-					
-					// Do spawn.
-					antharasSpawn = _monsterSpawn.get(npcId);
-					_antharas = (L2GrandBossInstance) antharasSpawn.doSpawn();
-					GrandBossManager.getInstance().addBoss(_antharas);
-					
-					_monsters.add(_antharas);
-					_antharas.setIsImmobilized(true);
-					
-					GrandBossManager.getInstance().setBossStatus(ANTHARAS_OLD_ID, DORMANT);
-					GrandBossManager.getInstance().setBossStatus(npcId, FIGHTING);
-					_LastAction = System.currentTimeMillis();
-					// Start repeating timer to check for inactivity
-					_activityCheckTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckActivity(), 60000, 60000);
-					
-					// Setting 1st time of minions spawn task.
-					if (!FWA_OLDANTHARAS)
-					{
-						startMinionSpawns(npcId);
-					}
-					
-					// Set next task.
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					_socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(2), 16);
-					break;
-				case 2:
-					// Set camera.
-					broadcastPacket(new SpecialCamera(_antharas, 700, 13, -19, 0, 10000, 20000, 0, 0, 0, 0, 0));
-					
-					// Set next task.
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					_socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(3), 3000);
-					break;
-				
-				case 3:
-					// Do social.
-					broadcastPacket(new SpecialCamera(_antharas, 700, 13, 0, 6000, 10000, 20000, 0, 0, 0, 0, 0));
-					// Set next task.
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					_socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(4), 10000);
-					break;
-				case 4:
-					broadcastPacket(new SpecialCamera(_antharas, 3700, 0, -3, 0, 10000, 10000, 0, 0, 0, 0, 0));
-					// Set next task.
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					_socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(5), 200);
-					break;
-				
-				case 5:
-					// Do social.
-					broadcastPacket(new SpecialCamera(_antharas, 1100, 0, -3, 22000, 10000, 30000, 0, 0, 0, 0, 0));
-					// Set next task.
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					_socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(6), 10800);
-					break;
-				
-				case 6:
-					// Set camera.
-					broadcastPacket(new SpecialCamera(_antharas, 1100, 0, -3, 300, 10000, 7000, 0, 0, 0, 0, 0));
-					// Set next task.
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					_socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(7), 1900);
-					break;
-				
-				case 7:
-					_antharas.abortCast();
-					
-					_mobiliseTask = ThreadPoolManager.getInstance().scheduleGeneral(new SetMobilised(_antharas), 16);
-					
-					// Move at random.
-					if (FWA_MOVEATRANDOM)
-					{
-						Location pos = new Location(getRandom(175000, 178500), getRandom(112400, 116000), -7707, 0);
-						_moveAtRandomTask = ThreadPoolManager.getInstance().scheduleGeneral(new MoveAtRandom(_antharas, pos), 500);
-					}
-					
-					if (_socialTask != null)
-					{
-						_socialTask.cancel(true);
-						_socialTask = null;
-					}
-					break;
-			}
-		}
-	}
-	
-	protected void broadcastPacket(L2GameServerPacket mov)
-	{
-		if (_Zone != null)
-		{
-			for (L2Character characters : _Zone.getCharactersInside())
-			{
-				if (characters.isPlayer())
-				{
-					characters.sendPacket(mov);
-				}
-			}
-		}
-	}
-	
-	// Do spawn Behemoth or Bomber.
-	private class MobsSpawn implements Runnable
-	{
-		public MobsSpawn()
-		{
-		}
-		
-		@Override
-		public void run()
-		{
-			L2NpcTemplate template1;
-			L2Spawn tempSpawn;
-			boolean isBehemoth = getRandom(100) < FWA_PERCENTOFBEHEMOTH;
-			try
-			{
-				int mobNumber = (isBehemoth ? 2 : 3);
-				// Set spawn.
-				for (int i = 0; i < mobNumber; i++)
-				{
-					if (_monsters.size() >= FWA_MAXMOBS)
-					{
-						break;
-					}
-					int npcId;
-					if (isBehemoth)
-					{
-						npcId = 29069;
-					}
-					else
-					{
-						npcId = getRandom(29070, 29076);
-					}
-					template1 = NpcTable.getInstance().getTemplate(npcId);
-					tempSpawn = new L2Spawn(template1);
-					// allocates it at random in the lair of Antharas.
-					int tried = 0;
-					boolean notFound = true;
-					int x = 175000;
-					int y = 112400;
-					int dt = ((_antharas.getX() - x) * (_antharas.getX() - x)) + ((_antharas.getY() - y) * (_antharas.getY() - y));
-					while ((tried++ < 25) && notFound)
-					{
-						int rx = getRandom(175000, 179900);
-						int ry = getRandom(112400, 116000);
-						int rdt = ((_antharas.getX() - rx) * (_antharas.getX() - rx)) + ((_antharas.getY() - ry) * (_antharas.getY() - ry));
-						if (GeoData.getInstance().canSeeTarget(_antharas.getX(), _antharas.getY(), -7704, rx, ry, -7704))
-						{
-							if (rdt < dt)
-							{
-								x = rx;
-								y = ry;
-								dt = rdt;
-								if (rdt <= 900000)
-								{
-									notFound = false;
-								}
-							}
-						}
-					}
-					tempSpawn.setX(x);
-					tempSpawn.setY(y);
-					tempSpawn.setZ(-7704);
-					tempSpawn.setHeading(0);
-					tempSpawn.setAmount(1);
-					tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
-					SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
-					// Do spawn.
-					_monsters.add(tempSpawn.doSpawn());
-				}
-			}
-			catch (Exception e)
-			{
-				_log.warning(e.getMessage());
-			}
-		}
-	}
-	
-	@Override
-	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon)
-	{
-		switch (npc.getId())
-		{
-			case 29070:
-			case 29071:
-			case 29072:
-			case 29073:
-			case 29074:
-			case 29075:
-			case 29076:
-				if ((_selfDestructionTask == null) && !npc.isDead())
-				{
-					_selfDestructionTask = ThreadPoolManager.getInstance().scheduleGeneral(new SelfDestructionOfBomber(npc), FWA_SELFDESTRUCTTIME);
-				}
-				break;
-		}
-		return super.onAggroRangeEnter(npc, player, isSummon);
-	}
-	
-	// Do self destruction.
-	private class SelfDestructionOfBomber implements Runnable
-	{
-		private final L2Npc _bomber;
-		
-		public SelfDestructionOfBomber(L2Npc bomber)
-		{
-			_bomber = bomber;
-		}
-		
-		@Override
-		public void run()
-		{
-			L2Skill skill = null;
-			switch (_bomber.getId())
-			{
-				case 29070:
-				case 29071:
-				case 29072:
-				case 29073:
-				case 29074:
-				case 29075:
-					skill = SkillTable.getInstance().getInfo(5097, 1);
-					break;
-				case 29076:
-					skill = SkillTable.getInstance().getInfo(5094, 1);
-					break;
-			}
-			
-			_bomber.doCast(skill);
-			if (_selfDestructionTask != null)
-			{
-				_selfDestructionTask.cancel(false);
-				_selfDestructionTask = null;
-			}
-		}
-	}
-	
-	@Override
-	public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill)
-	{
-		if (npc.isInvul())
-		{
-			return null;
-		}
-		else if ((skill != null) && ((skill.getId() == 5097) || (skill.getId() == 5094)))
-		{
-			switch (npc.getId())
-			{
-				case 29070:
-				case 29071:
-				case 29072:
-				case 29073:
-				case 29074:
-				case 29075:
-				case 29076:
-					npc.doDie(npc);
-					break;
-			}
-		}
-		return super.onSpellFinished(npc, player, skill);
-	}
-	
-	// At end of activity time.
-	protected class CheckActivity implements Runnable
-	{
-		@Override
-		public void run()
-		{
-			Long temp = (System.currentTimeMillis() - _LastAction);
-			if (temp > FWA_INACTIVITYTIME)
-			{
-				GrandBossManager.getInstance().setBossStatus(_antharas.getId(), DORMANT);
-				setUnspawn();
-			}
-		}
-	}
-	
-	// Clean Antharas's lair.
-	public void setUnspawn()
-	{
-		// Eliminate players.
-		_Zone.oustAllPlayers();
-		
-		// Not executed tasks is canceled.
-		if (_cubeSpawnTask != null)
-		{
-			_cubeSpawnTask.cancel(true);
-			_cubeSpawnTask = null;
-		}
-		if (_monsterSpawnTask != null)
-		{
-			_monsterSpawnTask.cancel(true);
-			_monsterSpawnTask = null;
-		}
-		if (_activityCheckTask != null)
-		{
-			_activityCheckTask.cancel(false);
-			_activityCheckTask = null;
-		}
-		if (_socialTask != null)
-		{
-			_socialTask.cancel(true);
-			_socialTask = null;
-		}
-		if (_mobiliseTask != null)
-		{
-			_mobiliseTask.cancel(true);
-			_mobiliseTask = null;
-		}
-		if (_mobsSpawnTask != null)
-		{
-			_mobsSpawnTask.cancel(true);
-			_mobsSpawnTask = null;
-		}
-		if (_selfDestructionTask != null)
-		{
-			_selfDestructionTask.cancel(true);
-			_selfDestructionTask = null;
-		}
-		if (_moveAtRandomTask != null)
-		{
-			_moveAtRandomTask.cancel(true);
-			_moveAtRandomTask = null;
-		}
-		
-		// Delete monsters.
-		for (L2Npc mob : _monsters)
-		{
-			mob.getSpawn().stopRespawn();
-			mob.deleteMe();
-		}
-		_monsters.clear();
-		
-		// Delete teleport cube.
-		for (L2Npc cube : _teleportCube)
-		{
-			cube.getSpawn().stopRespawn();
-			cube.deleteMe();
-		}
-		_teleportCube.clear();
-	}
-	
-	// Do spawn teleport cube.
-	private class CubeSpawn implements Runnable
-	{
-		private final int _type;
-		
-		public CubeSpawn(int type)
-		{
-			_type = type;
-		}
-		
-		@Override
-		public void run()
-		{
-			if (_type == 0)
-			{
-				spawnCube();
-				_cubeSpawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new CubeSpawn(1), 1800000);
-			}
-			else
-			{
-				setUnspawn();
-			}
-		}
-	}
-	
-	// UnLock Antharas.
-	private static class UnlockAntharas implements Runnable
-	{
-		private final int _bossId;
-		
-		public UnlockAntharas(int bossId)
-		{
-			_bossId = bossId;
-		}
-		
-		@Override
-		public void run()
-		{
-			GrandBossManager.getInstance().setBossStatus(_bossId, DORMANT);
-			if (FWA_DOSERVEREARTHQUAKE)
-			{
-				for (L2PcInstance p : L2World.getInstance().getPlayers())
-				{
-					p.broadcastPacket(new Earthquake(185708, 114298, -8221, 20, 10));
-				}
-			}
-		}
-	}
-	
-	// Action is enabled the boss.
-	private class SetMobilised implements Runnable
-	{
-		private final L2GrandBossInstance _boss;
-		
-		public SetMobilised(L2GrandBossInstance boss)
-		{
-			_boss = boss;
-		}
-		
-		@Override
-		public void run()
-		{
-			_boss.setIsImmobilized(false);
-			
-			// When it is possible to act, a social action is canceled.
-			if (_socialTask != null)
-			{
-				_socialTask.cancel(true);
-				_socialTask = null;
-			}
-		}
-	}
-	
-	// Move at random on after Antharas appears.
-	private static class MoveAtRandom implements Runnable
-	{
-		private final L2Npc _npc;
-		private final Location _loc;
-		
-		public MoveAtRandom(L2Npc npc, Location loc)
-		{
-			_npc = npc;
-			_loc = loc;
-		}
-		
-		@Override
-		public void run()
-		{
-			_npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, _loc);
-		}
-	}
-	
-	@Override
-	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
-	{
-		if ((npc.getId() == 29019) || (npc.getId() == 29066) || (npc.getId() == 29067) || (npc.getId() == 29068))
-		{
-			_LastAction = System.currentTimeMillis();
-			if (GrandBossManager.getInstance().getBossStatus(_antharas.getId()) != FIGHTING)
-			{
-				_Zone.oustAllPlayers();
-			}
-			else if (!FWA_OLDANTHARAS && (_mobsSpawnTask == null))
-			{
-				startMinionSpawns(npc.getId());
-			}
-		}
-		else if ((npc.getId() > 29069) && (npc.getId() < 29077) && (npc.getCurrentHp() <= damage))
-		{
-			L2Skill skill = null;
-			switch (npc.getId())
-			{
-				case 29070:
-				case 29071:
-				case 29072:
-				case 29073:
-				case 29074:
-				case 29075:
-					skill = SkillTable.getInstance().getInfo(5097, 1);
-					break;
-				case 29076:
-					skill = SkillTable.getInstance().getInfo(5094, 1);
-					break;
-			}
-			
-			npc.doCast(skill);
-		}
-		return super.onAttack(npc, attacker, damage, isSummon);
-	}
-	
-	@Override
-	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
-	{
-		if ((npc.getId() == 29019) || (npc.getId() == 29066) || (npc.getId() == 29067) || (npc.getId() == 29068))
-		{
-			broadcastPacket(new SpecialCamera(_antharas, 1200, 20, -10, 0, 10000, 13000, 0, 0, 0, 0, 0));
-			npc.broadcastPacket(new PlaySound(1, "BS01_D", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
-			_cubeSpawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new CubeSpawn(0), 10000);
-			GrandBossManager.getInstance().setBossStatus(npc.getId(), DEAD);
-			// Calculate Min and Max respawn times randomly.
-			long respawnTime = Config.ANTHARAS_SPAWN_INTERVAL + getRandom(-Config.ANTHARAS_SPAWN_RANDOM, Config.ANTHARAS_SPAWN_RANDOM);
-			respawnTime *= 3600000;
-			
-			ThreadPoolManager.getInstance().scheduleGeneral(new UnlockAntharas(npc.getId()), respawnTime);
-			// also save the respawn time so that the info is maintained past reboots
-			StatsSet info = GrandBossManager.getInstance().getStatsSet(npc.getId());
-			info.set("respawn_time", (System.currentTimeMillis() + respawnTime));
-			GrandBossManager.getInstance().setStatsSet(npc.getId(), info);
-		}
-		else if (npc.getId() == 29069)
-		{
-			int countHPHerb = getRandom(6, 18);
-			int countMPHerb = getRandom(6, 18);
-			for (int i = 0; i < countHPHerb; i++)
-			{
-				npc.dropItem(killer, 8602, 1);
-			}
-			for (int i = 0; i < countMPHerb; i++)
-			{
-				((L2MonsterInstance) npc).dropItem(killer, 8605, 1);
-			}
-		}
-		if (_monsters.contains(npc))
-		{
-			_monsters.remove(npc);
-		}
-		return super.onKill(npc, killer, isSummon);
-	}
-	
-	public static void main(String[] args)
-	{
-		new Antharas();
-	}
-}
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-01.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-01.html
new file mode 100644
index 0000000000..6a4180d3cf
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-01.html
@@ -0,0 +1,8 @@
+<html><body>Heart of Warding:<br>
+You are overcome by a voice, a voice so powerful you are helpless as it speaks.<br>
+<font color="LEVEL">Do not expect Shilen's authority will diminish<br>
+while false gods freely roam.<br>
+Leave, and<br>
+prepare to face the return of Antharas.</font><br>
+(Challenging Antharas is not currently available.)
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-02.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-02.html
new file mode 100644
index 0000000000..621c656ac3
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-02.html
@@ -0,0 +1,6 @@
+<html><body>Heart of Warding:<br>
+You are overcome by a voice, a voice so powerful you are helpless as it speaks:<br>
+<font color="LEVEL">Do not expect that you might challenge Antharas at your own convenience.<br>
+When the time is right, Shilen's authority will judge you.</font><br>
+(Currently, other members are challenging Antharas.)
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-03.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-03.html
new file mode 100644
index 0000000000..ac73fde2d8
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-03.html
@@ -0,0 +1,6 @@
+<html><body>Heart of Warding:<br>
+A voice that can shatter your entire body is resonating in your head:<br>
+<font color="LEVEL">Do not dare to face Shilen's authority<br>
+without the most determined preparation.</font><br>
+(Only those who have the Portal Stone can challenge Antharas.)
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-04.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-04.html
new file mode 100644
index 0000000000..58a09b5266
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-04.html
@@ -0,0 +1,6 @@
+<html><body>Heart of Warding:<br>
+You are overcome by a voice, a voice so powerful you are helpless as it speaks:<br>
+<font color="LEVEL">No matter how many gather to follow false gods,<br>
+Shilen's authority is too great.</font><br>
+(The number of participants are above the allowed number in challenging Antharas.)
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-05.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-05.html
new file mode 100644
index 0000000000..4db462db24
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001-05.html
@@ -0,0 +1,6 @@
+<html><body>Heart of Warding:<br>
+You are overcome by a voice, a voice so powerful you are helpless as it speaks:<br>
+<font color="LEVEL">You seek death and defeat by coming here without your leader! You appear before Shilen's authority<br>
+and you tempt Shilen's wrath!</font><br>
+(The players who belong to an association can only enter through the Association Leader.)
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001.html
new file mode 100644
index 0000000000..6958161c9a
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/13001.html
@@ -0,0 +1,12 @@
+<html><body>Heart of Warding:<br>
+You are overcome by a voice, a voice so powerful you are helpless as it speaks:<br>
+<font color="LEVEL">A terrible creature <br>
+fell to the earth from above <br>
+in order to vent a mother's spite,<br>
+cursed and forsaken by her own children.<br>
+Dark Pilgrim of the Holy Land,<br>
+Do you dare face the Land Dragon Antharas?</font><br>
+(A maximum of 200 people can challenge Antharas.)<br>
+<a action="bypass -h npc_%objectId%_Quest Antharas enter">Move to Antharas' Nest</a><br>
+<a action="bypass -h npc_%objectId%_Quest">Quest</a>
+</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/Antharas.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/Antharas.java
new file mode 100644
index 0000000000..8ff4fabf44
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Antharas/Antharas.java
@@ -0,0 +1,1055 @@
+/*
+ * Copyright (C) 2004-2013 L2J DataPack
+ *
+ * This file is part of L2J DataPack.
+ *
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package ai.individual.Antharas;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import ai.npc.AbstractNpcAI;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.enums.MountType;
+import com.l2jserver.gameserver.instancemanager.GrandBossManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
+import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.StatsSet;
+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.instance.L2GrandBossInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.zone.type.L2NoRestartZone;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.serverpackets.Earthquake;
+import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage;
+import com.l2jserver.gameserver.network.serverpackets.PlaySound;
+import com.l2jserver.gameserver.network.serverpackets.SocialAction;
+import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
+import com.l2jserver.gameserver.util.Broadcast;
+import com.l2jserver.gameserver.util.Util;
+
+/**
+ * Antharas AI.
+ * @author St3eT
+ */
+public final class Antharas extends AbstractNpcAI
+{
+	// NPC
+	private static final int ANTHARAS = 29068; // Antharas
+	private static final int BEHEMOTH = 29069; // Behemoth Dragon
+	private static final int TERASQUE = 29190; // Tarask Dragon
+	private static final int BOMBER = 29070; // Dragon Bomber
+	private static final int HEART = 13001; // Heart of Warding
+	private static final int CUBE = 31859; // Teleportation Cubic
+	private static final Map<Integer, Location> INVISIBLE_NPC = new HashMap<>();
+	{
+		INVISIBLE_NPC.put(29077, new Location(177229, 113298, -7735)); // antaras_clear_npc_1
+		INVISIBLE_NPC.put(29078, new Location(176707, 113585, -7735)); // antaras_clear_npc_2
+		INVISIBLE_NPC.put(29079, new Location(176385, 113889, -7735)); // antaras_clear_npc_3
+		INVISIBLE_NPC.put(29080, new Location(176082, 114241, -7735)); // antaras_clear_npc_4
+		INVISIBLE_NPC.put(29081, new Location(176066, 114802, -7735)); // antaras_clear_npc_5
+		INVISIBLE_NPC.put(29082, new Location(176095, 115313, -7735)); // antaras_clear_npc_6
+		INVISIBLE_NPC.put(29083, new Location(176425, 115829, -7735)); // antaras_clear_npc_7
+		INVISIBLE_NPC.put(29084, new Location(176949, 116378, -7735)); // antaras_clear_npc_8
+		INVISIBLE_NPC.put(29085, new Location(177655, 116402, -7735)); // antaras_clear_npc_9
+		INVISIBLE_NPC.put(29086, new Location(178248, 116395, -7735)); // antaras_clear_npc_10
+		INVISIBLE_NPC.put(29087, new Location(178706, 115998, -7735)); // antaras_clear_npc_11
+		INVISIBLE_NPC.put(29088, new Location(179208, 115452, -7735)); // antaras_clear_npc_12
+		INVISIBLE_NPC.put(29089, new Location(179191, 115079, -7735)); // antaras_clear_npc_13
+		INVISIBLE_NPC.put(29090, new Location(179221, 114546, -7735)); // antaras_clear_npc_14
+		INVISIBLE_NPC.put(29091, new Location(178916, 113925, -7735)); // antaras_clear_npc_15
+		INVISIBLE_NPC.put(29092, new Location(178782, 113814, -7735)); // antaras_clear_npc_16
+		INVISIBLE_NPC.put(29093, new Location(178419, 113417, -7735)); // antaras_clear_npc_17
+		INVISIBLE_NPC.put(29094, new Location(177855, 113282, -7735)); // antaras_clear_npc_18
+	}
+	
+	// Item
+	private static final int STONE = 3865; // Portal Stone
+	// Skill
+	private static final SkillHolder ANTH_JUMP = new SkillHolder(4106, 1); // Antharas Stun
+	private static final SkillHolder ANTH_TAIL = new SkillHolder(4107, 1); // Antharas Stun
+	private static final SkillHolder ANTH_FEAR = new SkillHolder(4108, 1); // Antharas Terror
+	private static final SkillHolder ANTH_DEBUFF = new SkillHolder(4109, 1); // Curse of Antharas
+	private static final SkillHolder ANTH_MOUTH = new SkillHolder(4110, 2); // Breath Attack
+	private static final SkillHolder ANTH_BREATH = new SkillHolder(4111, 1); // Antharas Fossilization
+	private static final SkillHolder ANTH_NORM_ATTACK = new SkillHolder(4112, 1); // Ordinary Attack
+	private static final SkillHolder ANTH_NORM_ATTACK_EX = new SkillHolder(4113, 1); // Animal doing ordinary attack
+	private static final SkillHolder ANTH_REGEN_1 = new SkillHolder(4125, 1); // Antharas Regeneration
+	private static final SkillHolder ANTH_REGEN_2 = new SkillHolder(4239, 1); // Antharas Regeneration
+	private static final SkillHolder ANTH_REGEN_3 = new SkillHolder(4240, 1); // Antharas Regeneration
+	private static final SkillHolder ANTH_REGEN_4 = new SkillHolder(4241, 1); // Antharas Regeneration
+	private static final SkillHolder DISPEL_BOM = new SkillHolder(5042, 1); // NPC Dispel Bomb
+	private static final SkillHolder ANTH_ANTI_STRIDER = new SkillHolder(4258, 1); // Hinder Strider
+	private static final SkillHolder ANTH_FEAR_SHORT = new SkillHolder(5092, 1); // Antharas Terror
+	private static final SkillHolder ANTH_METEOR = new SkillHolder(5093, 1); // Antharas Meteor
+	// Zone
+	private static final L2NoRestartZone zone = ZoneManager.getInstance().getZoneById(70050, L2NoRestartZone.class); // Antharas Nest zone
+	// Status
+	private static final int ALIVE = 0;
+	private static final int WAITING = 1;
+	private static final int IN_FIGHT = 2;
+	private static final int DEAD = 3;
+	// Misc
+	private static final int MAX_PEOPLE = 200; // Max allowed players
+	private L2GrandBossInstance _antharas = null;
+	private static long _lastAttack = 0;
+	private static int _minionCount = 0;
+	private static int minionMultipler = 0;
+	private static int moveChance = 0;
+	private static int sandStorm = 0;
+	private static L2PcInstance attacker_1 = null;
+	private static L2PcInstance attacker_2 = null;
+	private static L2PcInstance attacker_3 = null;
+	private static int attacker_1_hate = 0;
+	private static int attacker_2_hate = 0;
+	private static int attacker_3_hate = 0;
+	
+	private Antharas()
+	{
+		super(Antharas.class.getSimpleName(), "ai/individual");
+		addStartNpc(HEART, CUBE);
+		addTalkId(HEART, CUBE);
+		addFirstTalkId(HEART);
+		addSpawnId(INVISIBLE_NPC.keySet());
+		addSpawnId(ANTHARAS);
+		addMoveFinishedId(BOMBER);
+		addAggroRangeEnterId(BOMBER);
+		addSpellFinishedId(ANTHARAS);
+		addAttackId(ANTHARAS, BOMBER, BEHEMOTH, TERASQUE);
+		addKillId(ANTHARAS, TERASQUE, BEHEMOTH);
+		
+		final StatsSet info = GrandBossManager.getInstance().getStatsSet(ANTHARAS);
+		final int curr_hp = info.getInt("currentHP");
+		final int curr_mp = info.getInt("currentMP");
+		final int loc_x = info.getInt("loc_x");
+		final int loc_y = info.getInt("loc_y");
+		final int loc_z = info.getInt("loc_z");
+		final int heading = info.getInt("heading");
+		final long respawnTime = info.getLong("respawn_time");
+		
+		switch (getStatus())
+		{
+			case ALIVE:
+			{
+				_antharas = (L2GrandBossInstance) addSpawn(ANTHARAS, 185708, 114298, -8221, 0, false, 0);
+				_antharas.setCurrentHpMp(curr_hp, curr_mp);
+				addBoss(_antharas);
+				break;
+			}
+			case WAITING:
+			{
+				_antharas = (L2GrandBossInstance) addSpawn(ANTHARAS, 185708, 114298, -8221, 0, false, 0);
+				_antharas.setCurrentHpMp(curr_hp, curr_mp);
+				addBoss(_antharas);
+				startQuestTimer("SPAWN_ANTHARAS", Config.ANTHARAS_WAIT_TIME * 60000, null, null);
+				break;
+			}
+			case IN_FIGHT:
+			{
+				_antharas = (L2GrandBossInstance) addSpawn(ANTHARAS, loc_x, loc_y, loc_z, heading, false, 0);
+				_antharas.setCurrentHpMp(curr_hp, curr_mp);
+				addBoss(_antharas);
+				_lastAttack = System.currentTimeMillis();
+				startQuestTimer("CHECK_ATTACK", 60000, _antharas, null);
+				startQuestTimer("SPAWN_MINION", 300000, _antharas, null);
+				break;
+			}
+			case DEAD:
+			{
+				final long remain = respawnTime - System.currentTimeMillis();
+				if (remain > 0)
+				{
+					startQuestTimer("CLEAR_STATUS", remain, null, null);
+				}
+				else
+				{
+					setStatus(ALIVE);
+					_antharas = (L2GrandBossInstance) addSpawn(ANTHARAS, 185708, 114298, -8221, 0, false, 0);
+					addBoss(_antharas);
+				}
+				break;
+			}
+		}
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		switch (event)
+		{
+			case "enter":
+			{
+				String htmltext = null;
+				if (getStatus() == DEAD)
+				{
+					htmltext = "13001-01.html";
+				}
+				else if (getStatus() == IN_FIGHT)
+				{
+					htmltext = "13001-02.html";
+				}
+				else if (zone.getPlayersInside().size() >= MAX_PEOPLE)
+				{
+					htmltext = "13001-04.html";
+				}
+				else if (player.isInParty())
+				{
+					final L2Party party = player.getParty();
+					final boolean isInCC = party.isInCommandChannel();
+					final List<L2PcInstance> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
+					final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
+					if (!isPartyLeader)
+					{
+						htmltext = "13001-05.html";
+					}
+					else if (!hasQuestItems(player, STONE))
+					{
+						htmltext = "13001-03.html";
+					}
+					else if (members.size() > (MAX_PEOPLE - zone.getPlayersInside().size()))
+					{
+						htmltext = "13001-04.html";
+					}
+					else
+					{
+						for (L2PcInstance member : members)
+						{
+							if (member.isInsideRadius(npc, 1000, true, false))
+							{
+								member.teleToLocation(179700 + getRandom(700), 113800 + getRandom(2100), -7709);
+							}
+						}
+						if (getStatus() != WAITING)
+						{
+							setStatus(WAITING);
+							startQuestTimer("SPAWN_ANTHARAS", Config.ANTHARAS_WAIT_TIME * 60000, null, null);
+						}
+					}
+				}
+				else
+				{
+					if (!hasQuestItems(player, STONE))
+					{
+						htmltext = "13001-03.html";
+					}
+					else
+					{
+						player.teleToLocation(179700 + getRandom(700), 113800 + getRandom(2100), -7709);
+						if (getStatus() != WAITING)
+						{
+							setStatus(WAITING);
+							startQuestTimer("SPAWN_ANTHARAS", Config.ANTHARAS_WAIT_TIME * 60000, null, null);
+						}
+					}
+				}
+				return htmltext;
+			}
+			case "teleportOut":
+			{
+				player.teleToLocation(79800 + getRandom(600), 151200 + getRandom(1100), -3534);
+				break;
+			}
+			case "SPAWN_ANTHARAS":
+			{
+				_antharas.teleToLocation(181323, 114850, -7623, 32542);
+				setStatus(IN_FIGHT);
+				_lastAttack = System.currentTimeMillis();
+				zone.broadcastPacket(new PlaySound("BS02_A"));
+				startQuestTimer("CAMERA_1", 23, _antharas, null);
+				break;
+			}
+			case "CAMERA_1":
+			{
+				zone.broadcastPacket(new SpecialCamera(npc, 700, 13, -19, 0, 10000, 20000, 0, 0, 0, 0, 0));
+				startQuestTimer("CAMERA_2", 3000, npc, null);
+				break;
+			}
+			case "CAMERA_2":
+			{
+				zone.broadcastPacket(new SpecialCamera(npc, 700, 13, 0, 6000, 10000, 20000, 0, 0, 0, 0, 0));
+				startQuestTimer("CAMERA_3", 10000, npc, null);
+				break;
+			}
+			case "CAMERA_3":
+			{
+				zone.broadcastPacket(new SpecialCamera(npc, 3700, 0, -3, 0, 10000, 10000, 0, 0, 0, 0, 0));
+				zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
+				startQuestTimer("CAMERA_4", 200, npc, null);
+				startQuestTimer("SOCIAL", 5200, npc, null);
+				break;
+			}
+			case "CAMERA_4":
+			{
+				zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 22000, 10000, 30000, 0, 0, 0, 0, 0));
+				startQuestTimer("CAMERA_5", 10800, npc, null);
+				break;
+			}
+			case "CAMERA_5":
+			{
+				zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 300, 10000, 7000, 0, 0, 0, 0, 0));
+				startQuestTimer("START_MOVE", 1900, npc, null);
+				break;
+			}
+			case "SOCIAL":
+			{
+				zone.broadcastPacket(new SocialAction(npc.getObjectId(), 2));
+				break;
+			}
+			case "START_MOVE":
+			{
+				for (L2PcInstance players : npc.getKnownList().getKnownPlayersInRadius(4000))
+				{
+					if (players.isHero())
+					{
+						zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.S1_YOU_CANNOT_HOPE_TO_DEFEAT_ME_WITH_YOUR_MEAGER_STRENGTH, 2, 4000, players.getName()));
+						break;
+					}
+				}
+				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(179011, 114871, -7704));
+				startQuestTimer("CHECK_ATTACK", 60000, npc, null);
+				startQuestTimer("SPAWN_MINION", 300000, npc, null);
+				break;
+			}
+			case "SET_REGEN":
+			{
+				if (npc != null)
+				{
+					if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
+					{
+						if (!npc.isAffectedBySkill(ANTH_REGEN_4.getSkillId()))
+						{
+							npc.doCast(ANTH_REGEN_4.getSkill());
+						}
+					}
+					else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
+					{
+						if (!npc.isAffectedBySkill(ANTH_REGEN_3.getSkillId()))
+						{
+							npc.doCast(ANTH_REGEN_3.getSkill());
+						}
+					}
+					else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
+					{
+						if (!npc.isAffectedBySkill(ANTH_REGEN_2.getSkillId()))
+						{
+							npc.doCast(ANTH_REGEN_2.getSkill());
+						}
+					}
+					else if (!npc.isAffectedBySkill(ANTH_REGEN_1.getSkillId()))
+					{
+						npc.doCast(ANTH_REGEN_1.getSkill());
+					}
+					startQuestTimer("SET_REGEN", 60000, npc, null);
+				}
+				break;
+			}
+			case "CHECK_ATTACK":
+			{
+				if ((npc != null) && ((_lastAttack + 900000) < System.currentTimeMillis()))
+				{
+					setStatus(ALIVE);
+					for (L2Character charInside : zone.getCharactersInside())
+					{
+						if (charInside != null)
+						{
+							if (charInside.isNpc())
+							{
+								if (charInside.getId() == ANTHARAS)
+								{
+									charInside.teleToLocation(185708, 114298, -8221);
+								}
+								else
+								{
+									charInside.deleteMe();
+								}
+							}
+							else if (charInside.isPlayer())
+							{
+								charInside.teleToLocation(79800 + getRandom(600), 151200 + getRandom(1100), -3534);
+							}
+						}
+					}
+					cancelQuestTimer("CHECK_ATTACK", npc, null);
+					cancelQuestTimer("SPAWN_MINION", npc, null);
+				}
+				else if (npc != null)
+				{
+					if (attacker_1_hate > 10)
+					{
+						attacker_1_hate -= getRandom(10);
+					}
+					if (attacker_2_hate > 10)
+					{
+						attacker_2_hate -= getRandom(10);
+					}
+					if (attacker_3_hate > 10)
+					{
+						attacker_3_hate -= getRandom(10);
+					}
+					manageSkills(npc);
+					startQuestTimer("CHECK_ATTACK", 60000, npc, null);
+				}
+				break;
+			}
+			case "SPAWN_MINION":
+			{
+				if ((minionMultipler > 1) && (_minionCount < (100 - (minionMultipler * 2))))
+				{
+					for (int i = 0; i < minionMultipler; i++)
+					{
+						addSpawn(BEHEMOTH, npc, true);
+						addSpawn(TERASQUE, npc, true);
+					}
+					_minionCount += (minionMultipler * 2);
+				}
+				else if (_minionCount < 98)
+				{
+					addSpawn(BEHEMOTH, npc, true);
+					addSpawn(TERASQUE, npc, true);
+					_minionCount += 2;
+				}
+				else if (_minionCount < 99)
+				{
+					addSpawn((getRandomBoolean() ? BEHEMOTH : TERASQUE), npc, true);
+					_minionCount++;
+				}
+				
+				if ((getRandom(100) > 10) && (minionMultipler < 4))
+				{
+					minionMultipler++;
+				}
+				startQuestTimer("SPAWN_MINION", 300000, npc, null);
+				break;
+			}
+			case "CLEAR_ZONE":
+			{
+				for (L2Character charInside : zone.getCharactersInside())
+				{
+					if (charInside != null)
+					{
+						if (charInside.isNpc())
+						{
+							charInside.deleteMe();
+						}
+						else if (charInside.isPlayer())
+						{
+							charInside.teleToLocation(79800 + getRandom(600), 151200 + getRandom(1100), -3534);
+						}
+					}
+				}
+				break;
+			}
+			case "TID_USED_FEAR":
+			{
+				if ((npc != null) && (sandStorm == 0))
+				{
+					sandStorm = 1;
+					npc.disableCoreAI(true);
+					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(177648, 114816, -7735));
+					startQuestTimer("TID_FEAR_MOVE_TIMEOVER", 2000, npc, null);
+					startQuestTimer("TID_FEAR_COOLTIME", 300000, npc, null);
+				}
+				break;
+			}
+			case "TID_FEAR_COOLTIME":
+			{
+				sandStorm = 0;
+				break;
+			}
+			case "TID_FEAR_MOVE_TIMEOVER":
+			{
+				if ((sandStorm == 1) && (npc.getX() == 177648) && (npc.getY() == 114816))
+				{
+					sandStorm = 2;
+					moveChance = 0;
+					npc.disableCoreAI(false);
+					for (Map.Entry<Integer, Location> entry : INVISIBLE_NPC.entrySet())
+					{
+						addSpawn(entry.getKey(), entry.getValue());
+					}
+				}
+				else if (sandStorm == 1)
+				{
+					if (moveChance <= 3)
+					{
+						moveChance++;
+						npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(177648, 114816, -7735));
+						startQuestTimer("TID_FEAR_MOVE_TIMEOVER", 5000, npc, null);
+					}
+					else
+					{
+						npc.teleToLocation(177648, 114816, -7735, npc.getHeading());
+						startQuestTimer("TID_FEAR_MOVE_TIMEOVER", 1000, npc, null);
+					}
+				}
+				break;
+			}
+			case "CLEAR_STATUS":
+			{
+				_antharas = (L2GrandBossInstance) addSpawn(ANTHARAS, 185708, 114298, -8221, 0, false, 0);
+				addBoss(_antharas);
+				Broadcast.toAllOnlinePlayers(new Earthquake(185708, 114298, -8221, 20, 10));
+				setStatus(ALIVE);
+				break;
+			}
+			case "SKIP_WAITING":
+			{
+				if (getStatus() == WAITING)
+				{
+					cancelQuestTimer("SPAWN_ANTHARAS", null, null);
+					notifyEvent("SPAWN_ANTHARAS", null, null);
+					player.sendMessage(getClass().getSimpleName() + ": Skipping waiting time ...");
+				}
+				else
+				{
+					player.sendMessage(getClass().getSimpleName() + ": You cant skip waiting time right now!");
+				}
+				break;
+			}
+			case "RESPAWN_ANTHARAS":
+			{
+				if (getStatus() == DEAD)
+				{
+					setRespawn(0);
+					cancelQuestTimer("CLEAR_STATUS", null, null);
+					notifyEvent("CLEAR_STATUS", null, null);
+					player.sendMessage(getClass().getSimpleName() + ": Antharas has been respawned.");
+				}
+				else
+				{
+					player.sendMessage(getClass().getSimpleName() + ": You cant respawn antharas while antharas is alive!");
+				}
+				break;
+			}
+			case "DESPAWN_MINIONS":
+			{
+				if (getStatus() == IN_FIGHT)
+				{
+					_minionCount = 0;
+					for (L2Character charInside : zone.getCharactersInside())
+					{
+						if ((charInside != null) && charInside.isNpc() && ((charInside.getId() == BEHEMOTH) || (charInside.getId() == TERASQUE)))
+						{
+							charInside.deleteMe();
+						}
+					}
+					if (player != null) // Player dont will be null just when is this event called from GM command
+					{
+						player.sendMessage(getClass().getSimpleName() + ": All minions has been deleted!");
+					}
+				}
+				else if (player != null) // Player dont will be null just when is this event called from GM command
+				{
+					player.sendMessage(getClass().getSimpleName() + ": You cant despawn minions right now!");
+				}
+				break;
+			}
+			case "ABORT_FIGHT":
+			{
+				if (getStatus() == IN_FIGHT)
+				{
+					setStatus(ALIVE);
+					cancelQuestTimer("CHECK_ATTACK", _antharas, null);
+					cancelQuestTimer("SPAWN_MINION", _antharas, null);
+					for (L2Character charInside : zone.getCharactersInside())
+					{
+						if (charInside != null)
+						{
+							if (charInside.isNpc())
+							{
+								if (charInside.getId() == ANTHARAS)
+								{
+									charInside.teleToLocation(185708, 114298, -8221);
+								}
+								else
+								{
+									charInside.deleteMe();
+								}
+							}
+							else if (charInside.isPlayer() && !charInside.isGM())
+							{
+								charInside.teleToLocation(79800 + getRandom(600), 151200 + getRandom(1100), -3534);
+							}
+						}
+					}
+					player.sendMessage(getClass().getSimpleName() + ": Fight has been aborted!");
+				}
+				else
+				{
+					player.sendMessage(getClass().getSimpleName() + ": You cant abort fight right now!");
+				}
+				break;
+			}
+			case "MANAGE_SKILL":
+			{
+				manageSkills(npc);
+				break;
+			}
+		}
+		return super.onAdvEvent(event, npc, player);
+	}
+	
+	@Override
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon)
+	{
+		npc.doCast(DISPEL_BOM.getSkill());
+		npc.doDie(player);
+		return super.onAggroRangeEnter(npc, player, isSummon);
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, L2Skill skill)
+	{
+		_lastAttack = System.currentTimeMillis();
+		
+		if (npc.getId() == BOMBER)
+		{
+			if (npc.calculateDistance(attacker, true, false) < 230)
+			{
+				npc.doCast(DISPEL_BOM.getSkill());
+				npc.doDie(attacker);
+			}
+		}
+		else if (npc.getId() == ANTHARAS)
+		{
+			if (!zone.isCharacterInZone(attacker) || (getStatus() != IN_FIGHT))
+			{
+				_log.warning(getClass().getSimpleName() + ": Player " + attacker.getName() + " attacked Antharas in invalid conditions!");
+				attacker.teleToLocation(80464, 152294, -3534);
+			}
+			
+			if ((attacker.getMountType() == MountType.STRIDER) && !attacker.isAffectedBySkill(ANTH_ANTI_STRIDER.getSkillId()))
+			{
+				if (npc.checkDoCastConditions(ANTH_ANTI_STRIDER.getSkill()))
+				{
+					npc.setTarget(attacker);
+					npc.doCast(ANTH_ANTI_STRIDER.getSkill());
+				}
+			}
+			
+			if (skill == null)
+			{
+				refreshAiParams(attacker, (damage * 1000));
+			}
+			else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
+			{
+				refreshAiParams(attacker, ((damage / 3) * 100));
+			}
+			else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
+			{
+				refreshAiParams(attacker, (damage * 20));
+			}
+			else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
+			{
+				refreshAiParams(attacker, (damage * 10));
+			}
+			else
+			{
+				refreshAiParams(attacker, ((damage / 3) * 20));
+			}
+			manageSkills(npc);
+		}
+		return super.onAttack(npc, attacker, damage, isSummon, skill);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
+	{
+		if (zone.isCharacterInZone(killer))
+		{
+			if (npc.getId() == ANTHARAS)
+			{
+				_antharas = null;
+				notifyEvent("DESPAWN_MINIONS", null, null);
+				zone.broadcastPacket(new SpecialCamera(npc, 1200, 20, -10, 0, 10000, 13000, 0, 0, 0, 0, 0));
+				zone.broadcastPacket(new PlaySound("BS01_D"));
+				addSpawn(CUBE, 177615, 114941, -7709, 0, false, 900000);
+				long respawnTime = (Config.ANTHARAS_SPAWN_INTERVAL + getRandom(-Config.ANTHARAS_SPAWN_RANDOM, Config.ANTHARAS_SPAWN_RANDOM)) * 3600000;
+				setRespawn(respawnTime);
+				startQuestTimer("CLEAR_STATUS", respawnTime, null, null);
+				cancelQuestTimer("SET_REGEN", npc, null);
+				cancelQuestTimer("CHECK_ATTACK", npc, null);
+				cancelQuestTimer("SPAWN_MINION", npc, null);
+				startQuestTimer("CLEAR_ZONE", 900000, null, null);
+				setStatus(DEAD);
+			}
+			else
+			{
+				_minionCount--;
+			}
+		}
+		return super.onKill(npc, killer, isSummon);
+	}
+	
+	@Override
+	public void onMoveFinished(L2Npc npc)
+	{
+		npc.doCast(DISPEL_BOM.getSkill());
+		npc.doDie(null);
+	}
+	
+	@Override
+	public String onSpawn(L2Npc npc)
+	{
+		if (npc.getId() == ANTHARAS)
+		{
+			cancelQuestTimer("SET_REGEN", npc, null);
+			startQuestTimer("SET_REGEN", 60000, npc, null);
+			((L2Attackable) npc).setOnKillDelay(0);
+		}
+		else
+		{
+			for (int i = 1; i <= 6; i++)
+			{
+				final int x = npc.getTemplate().getParameters().getInt("suicide" + i + "_x");
+				final int y = npc.getTemplate().getParameters().getInt("suicide" + i + "_y");
+				final L2Attackable bomber = (L2Attackable) addSpawn(BOMBER, npc.getX(), npc.getY(), npc.getZ(), 0, true, 15000, true);
+				bomber.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(x, y, npc.getZ()));
+			}
+			npc.deleteMe();
+		}
+		return super.onSpawn(npc);
+	}
+	
+	@Override
+	public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill)
+	{
+		if ((skill.getId() == ANTH_FEAR.getSkillId()) || (skill.getId() == ANTH_FEAR_SHORT.getSkillId()))
+		{
+			startQuestTimer("TID_USED_FEAR", 7000, npc, null);
+		}
+		startQuestTimer("MANAGE_SKILL", 1000, npc, null);
+		return super.onSpellFinished(npc, player, skill);
+	}
+	
+	@Override
+	public boolean unload(boolean removeFromList)
+	{
+		if (_antharas != null)
+		{
+			_antharas.deleteMe();
+			_antharas = null;
+		}
+		return super.unload(removeFromList);
+	}
+	
+	private int getStatus()
+	{
+		return GrandBossManager.getInstance().getBossStatus(ANTHARAS);
+	}
+	
+	private void addBoss(L2GrandBossInstance grandboss)
+	{
+		GrandBossManager.getInstance().addBoss(grandboss);
+	}
+	
+	private void setStatus(int status)
+	{
+		GrandBossManager.getInstance().setBossStatus(ANTHARAS, status);
+	}
+	
+	private void setRespawn(long respawnTime)
+	{
+		GrandBossManager.getInstance().getStatsSet(ANTHARAS).set("respawn_time", (System.currentTimeMillis() + respawnTime));
+	}
+	
+	private final void refreshAiParams(L2PcInstance attacker, int damage)
+	{
+		if ((attacker_1 != null) && (attacker == attacker_1))
+		{
+			if (attacker_1_hate < (damage + 1000))
+			{
+				attacker_1_hate = damage + getRandom(3000);
+			}
+		}
+		else if ((attacker_2 != null) && (attacker == attacker_2))
+		{
+			if (attacker_2_hate < (damage + 1000))
+			{
+				attacker_2_hate = damage + getRandom(3000);
+			}
+		}
+		else if ((attacker_3 != null) && (attacker == attacker_3))
+		{
+			if (attacker_3_hate < (damage + 1000))
+			{
+				attacker_3_hate = damage + getRandom(3000);
+			}
+		}
+		else
+		{
+			final int i1 = Util.min(attacker_1_hate, attacker_2_hate, attacker_3_hate);
+			if (attacker_1_hate == i1)
+			{
+				attacker_1_hate = damage + getRandom(3000);
+				attacker_1 = attacker;
+			}
+			else if (attacker_2_hate == i1)
+			{
+				attacker_2_hate = damage + getRandom(3000);
+				attacker_2 = attacker;
+			}
+			else if (attacker_3_hate == i1)
+			{
+				attacker_3_hate = damage + getRandom(3000);
+				attacker_3 = attacker;
+			}
+		}
+	}
+	
+	private void manageSkills(L2Npc npc)
+	{
+		if (npc.isCastingNow() || npc.isCoreAIDisabled() || !npc.isInCombat())
+		{
+			return;
+		}
+		
+		int i1 = 0;
+		int i2 = 0;
+		L2PcInstance c2 = null;
+		if ((attacker_1 == null) || (npc.calculateDistance(attacker_1, true, false) > 9000) || attacker_1.isDead())
+		{
+			attacker_1_hate = 0;
+		}
+		
+		if ((attacker_2 == null) || (npc.calculateDistance(attacker_2, true, false) > 9000) || attacker_2.isDead())
+		{
+			attacker_2_hate = 0;
+		}
+		
+		if ((attacker_3 == null) || (npc.calculateDistance(attacker_3, true, false) > 9000) || attacker_3.isDead())
+		{
+			attacker_3_hate = 0;
+		}
+		
+		if (attacker_1_hate > attacker_2_hate)
+		{
+			i1 = 2;
+			i2 = attacker_1_hate;
+			c2 = attacker_1;
+		}
+		else if (attacker_2_hate > 0)
+		{
+			i1 = 3;
+			i2 = attacker_2_hate;
+			c2 = attacker_2;
+		}
+		
+		if (attacker_3_hate > i2)
+		{
+			i1 = 4;
+			i2 = attacker_3_hate;
+			c2 = attacker_3;
+		}
+		if (i2 > 0)
+		{
+			if (getRandom(100) < 70)
+			{
+				switch (i1)
+				{
+					case 2:
+					{
+						attacker_1_hate = 500;
+						break;
+					}
+					case 3:
+					{
+						attacker_2_hate = 500;
+						break;
+					}
+					case 4:
+					{
+						attacker_3_hate = 500;
+						break;
+					}
+				}
+			}
+			
+			final double distance_c2 = npc.calculateDistance(c2, true, false);
+			final double direction_c2 = npc.calculateDirectionTo(c2);
+			
+			SkillHolder skillToCast = null;
+			if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
+			{
+				if (getRandom(100) < 30)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_MOUTH;
+				}
+				else if ((getRandom(100) < 80) && (((distance_c2 < 1423) && (direction_c2 < 188) && (direction_c2 > 172)) || ((distance_c2 < 802) && (direction_c2 < 194) && (direction_c2 > 166))))
+				{
+					skillToCast = ANTH_TAIL;
+				}
+				else if ((getRandom(100) < 40) && (((distance_c2 < 850) && (direction_c2 < 210) && (direction_c2 > 150)) || ((distance_c2 < 425) && (direction_c2 < 270) && (direction_c2 > 90))))
+				{
+					skillToCast = ANTH_DEBUFF;
+				}
+				else if ((getRandom(100) < 10) && (distance_c2 < 1100))
+				{
+					skillToCast = ANTH_JUMP;
+				}
+				else if (getRandom(100) < 10)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_METEOR;
+				}
+				else if (getRandom(100) < 6)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_BREATH;
+				}
+				else if (getRandomBoolean())
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_NORM_ATTACK_EX;
+				}
+				else if (getRandom(100) < 5)
+				{
+					npc.setTarget(c2);
+					skillToCast = getRandomBoolean() ? ANTH_FEAR : ANTH_FEAR_SHORT;
+				}
+				else
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_NORM_ATTACK;
+				}
+			}
+			else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
+			{
+				if ((getRandom(100) < 80) && (((distance_c2 < 1423) && (direction_c2 < 188) && (direction_c2 > 172)) || ((distance_c2 < 802) && (direction_c2 < 194) && (direction_c2 > 166))))
+				{
+					skillToCast = ANTH_TAIL;
+				}
+				else if ((getRandom(100) < 40) && (((distance_c2 < 850) && (direction_c2 < 210) && (direction_c2 > 150)) || ((distance_c2 < 425) && (direction_c2 < 270) && (direction_c2 > 90))))
+				{
+					skillToCast = ANTH_DEBUFF;
+				}
+				else if ((getRandom(100) < 10) && (distance_c2 < 1100))
+				{
+					skillToCast = ANTH_JUMP;
+				}
+				else if (getRandom(100) < 7)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_METEOR;
+				}
+				else if (getRandom(100) < 6)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_BREATH;
+				}
+				else if (getRandomBoolean())
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_NORM_ATTACK_EX;
+				}
+				else if (getRandom(100) < 5)
+				{
+					npc.setTarget(c2);
+					skillToCast = getRandomBoolean() ? ANTH_FEAR : ANTH_FEAR_SHORT;
+				}
+				else
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_NORM_ATTACK;
+				}
+			}
+			else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
+			{
+				if ((getRandom(100) < 80) && (((distance_c2 < 1423) && (direction_c2 < 188) && (direction_c2 > 172)) || ((distance_c2 < 802) && (direction_c2 < 194) && (direction_c2 > 166))))
+				{
+					skillToCast = ANTH_TAIL;
+				}
+				else if ((getRandom(100) < 10) && (distance_c2 < 1100))
+				{
+					skillToCast = ANTH_JUMP;
+				}
+				else if (getRandom(100) < 5)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_METEOR;
+				}
+				else if (getRandom(100) < 6)
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_BREATH;
+				}
+				else if (getRandomBoolean())
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_NORM_ATTACK_EX;
+				}
+				else if (getRandom(100) < 5)
+				{
+					npc.setTarget(c2);
+					skillToCast = getRandomBoolean() ? ANTH_FEAR : ANTH_FEAR_SHORT;
+				}
+				else
+				{
+					npc.setTarget(c2);
+					skillToCast = ANTH_NORM_ATTACK;
+				}
+			}
+			else if ((getRandom(100) < 80) && (((distance_c2 < 1423) && (direction_c2 < 188) && (direction_c2 > 172)) || ((distance_c2 < 802) && (direction_c2 < 194) && (direction_c2 > 166))))
+			{
+				skillToCast = ANTH_TAIL;
+			}
+			else if (getRandom(100) < 3)
+			{
+				npc.setTarget(c2);
+				skillToCast = ANTH_METEOR;
+			}
+			else if (getRandom(100) < 6)
+			{
+				npc.setTarget(c2);
+				skillToCast = ANTH_BREATH;
+			}
+			else if (getRandomBoolean())
+			{
+				npc.setTarget(c2);
+				skillToCast = ANTH_NORM_ATTACK_EX;
+			}
+			else if (getRandom(100) < 5)
+			{
+				npc.setTarget(c2);
+				skillToCast = getRandomBoolean() ? ANTH_FEAR : ANTH_FEAR_SHORT;
+			}
+			else
+			{
+				npc.setTarget(c2);
+				skillToCast = ANTH_NORM_ATTACK;
+			}
+			
+			if ((skillToCast != null) && npc.checkDoCastConditions(skillToCast.getSkill()))
+			{
+				npc.doCast(skillToCast.getSkill());
+			}
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new Antharas();
+	}
+}
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-01.htm b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-01.htm
deleted file mode 100644
index 126ad8116b..0000000000
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-01.htm
+++ /dev/null
@@ -1,3 +0,0 @@
-<html><body>A voice whispers in your ear:<br>
-<font color="LEVEL">You may not confront Antharas now. Step back.</font>
-</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-02.htm b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-02.htm
deleted file mode 100644
index c16eac8376..0000000000
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-02.htm
+++ /dev/null
@@ -1,3 +0,0 @@
-<html><body>A voice whispers in your ear:<br>
-<font color="LEVEL">Some have already entered the Lair of Antharas. You may not enter until they are finished.</font>
-</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-03.htm b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-03.htm
deleted file mode 100644
index 6644e2ba34..0000000000
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/13001-03.htm
+++ /dev/null
@@ -1,3 +0,0 @@
-<html><body>A voice whispers in your ear:<br>
-<font color="LEVEL">Only those with a Portal Stone may meet Antharas. Step back.</font>
-</body></html>
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java
index 81fbb7ac7a..8ef885b50e 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java
@@ -18,7 +18,6 @@
  */
 package ai.npc.Teleports.GrandBossTeleporters;
 
-import ai.individual.Antharas;
 import ai.individual.Valakas;
 import ai.npc.AbstractNpcAI;
 
@@ -44,8 +43,6 @@ public final class GrandBossTeleporters extends AbstractNpcAI
 	// NPCs
 	private static final int[] NPCs =
 	{
-		13001, // Heart of Warding : Teleport into Lair of Antharas
-		31859, // Teleportation Cubic : Teleport out of Lair of Antharas
 		31384, // Gatekeeper of Fire Dragon : Opening some doors
 		31385, // Heart of Volcano : Teleport into Lair of Valakas
 		31540, // Watcher of Valakas Klein : Teleport into Hall of Flames
@@ -54,11 +51,8 @@ public final class GrandBossTeleporters extends AbstractNpcAI
 		31759, // Teleportation Cubic : Teleport out of Lair of Valakas
 	};
 	// Items
-	private static final int PORTAL_STONE = 3865;
 	private static final int VACUALITE_FLOATING_STONE = 7267;
 	private static final Location ENTER_HALL_OF_FLAMES = new Location(183813, -115157, -3303);
-	private static final Location TELEPORT_INTO_ANTHARAS_LAIR = new Location(179700, 113800, -7709);
-	private static final Location TELEPORT_OUT_OF_ANTHARAS_LAIR = new Location(79800, 151200, -3534);
 	private static final Location TELEPORT_INTO_VALAKAS_LAIR = new Location(204328, -111874, 70);
 	private static final Location TELEPORT_OUT_OF_VALAKAS_LAIR = new Location(150037, -57720, -2976);
 	
@@ -107,56 +101,6 @@ public final class GrandBossTeleporters extends AbstractNpcAI
 		
 		switch (npc.getId())
 		{
-			case 13001:
-			{
-				if (antharasAI() != null)
-				{
-					int status = GrandBossManager.getInstance().getBossStatus(29019);
-					int statusW = GrandBossManager.getInstance().getBossStatus(29066);
-					int statusN = GrandBossManager.getInstance().getBossStatus(29067);
-					int statusS = GrandBossManager.getInstance().getBossStatus(29068);
-					
-					if ((status == 2) || (statusW == 2) || (statusN == 2) || (statusS == 2))
-					{
-						htmltext = "13001-02.htm";
-					}
-					else if ((status == 3) || (statusW == 3) || (statusN == 3) || (statusS == 3))
-					{
-						htmltext = "13001-01.htm";
-					}
-					else if ((status == 0) || (status == 1)) // If entrance to see Antharas is unlocked (he is Dormant or Waiting)
-					{
-						if (st.hasQuestItems(PORTAL_STONE))
-						{
-							L2BossZone zone = GrandBossManager.getInstance().getZone(179700, 113800, -7709);
-							
-							if (zone != null)
-							{
-								zone.allowPlayerEntry(player, 30);
-							}
-							
-							player.teleToLocation(TELEPORT_INTO_ANTHARAS_LAIR.getX() + getRandom(700), TELEPORT_INTO_ANTHARAS_LAIR.getY() + getRandom(2100), TELEPORT_INTO_ANTHARAS_LAIR.getZ());
-							
-							if (status == 0)
-							{
-								L2GrandBossInstance antharas = GrandBossManager.getInstance().getBoss(29019);
-								antharasAI().notifyEvent("waiting", antharas, player);
-							}
-						}
-						else
-						{
-							htmltext = "13001-03.htm";
-						}
-					}
-				}
-				break;
-			}
-			case 31859:
-			{
-				
-				player.teleToLocation(TELEPORT_OUT_OF_ANTHARAS_LAIR.getX() + getRandom(600), TELEPORT_OUT_OF_ANTHARAS_LAIR.getY() + getRandom(1100), TELEPORT_OUT_OF_ANTHARAS_LAIR.getZ());
-				break;
-			}
 			case 31385:
 			{
 				if (valakasAI() != null)
@@ -263,11 +207,6 @@ public final class GrandBossTeleporters extends AbstractNpcAI
 		return QuestManager.getInstance().getQuest(Valakas.class.getSimpleName());
 	}
 	
-	private Quest antharasAI()
-	{
-		return QuestManager.getInstance().getQuest(Antharas.class.getSimpleName());
-	}
-	
 	public static void main(String[] args)
 	{
 		new GrandBossTeleporters();
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java
index b3aac2096f..8a73abb059 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java
@@ -81,6 +81,7 @@ import handlers.admincommandhandlers.AdminGeodata;
 import handlers.admincommandhandlers.AdminGm;
 import handlers.admincommandhandlers.AdminGmChat;
 import handlers.admincommandhandlers.AdminGraciaSeeds;
+import handlers.admincommandhandlers.AdminGrandBoss;
 import handlers.admincommandhandlers.AdminHeal;
 import handlers.admincommandhandlers.AdminHellbound;
 import handlers.admincommandhandlers.AdminHtml;
@@ -359,6 +360,7 @@ public class MasterHandler
 			AdminGm.class,
 			AdminGmChat.class,
 			AdminGraciaSeeds.class,
+			AdminGrandBoss.class,
 			AdminHeal.class,
 			AdminHellbound.class,
 			AdminHtml.class,
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminGrandBoss.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminGrandBoss.java
new file mode 100644
index 0000000000..03f1d8037c
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminGrandBoss.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2004-2013 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package handlers.admincommandhandlers;
+
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.StringTokenizer;
+
+import ai.individual.Antharas.Antharas;
+
+import com.l2jserver.gameserver.cache.HtmCache;
+import com.l2jserver.gameserver.handler.IAdminCommandHandler;
+import com.l2jserver.gameserver.instancemanager.GrandBossManager;
+import com.l2jserver.gameserver.instancemanager.QuestManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.zone.type.L2NoRestartZone;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+
+/**
+ * @author St3eT
+ */
+public class AdminGrandBoss implements IAdminCommandHandler
+{
+	private static final int ANTHARAS = 29068; // Antharas
+	private static final int ANTHARAS_ZONE = 70050; // Antharas Nest
+	private static final int VALAKAS = 29028; // Valakas
+	private static final int BAIUM = 29020; // Baium
+	private static final int QUEENANT = 29001; // Queen Ant
+	private static final int ORFEN = 29014; // Orfen
+	private static final int CORE = 29006; // Core
+	
+	private static final String[] ADMIN_COMMANDS =
+	{
+		"admin_grandboss",
+		"admin_grandboss_skip",
+		"admin_grandboss_respawn",
+		"admin_grandboss_minions",
+		"admin_grandboss_abort",
+	};
+	
+	@Override
+	public boolean useAdminCommand(String command, L2PcInstance activeChar)
+	{
+		final StringTokenizer st = new StringTokenizer(command, " ");
+		final String actualCommand = st.nextToken();
+		switch (actualCommand.toLowerCase())
+		{
+			case "admin_grandboss":
+			{
+				if (st.hasMoreTokens())
+				{
+					final int grandBossId = Integer.parseInt(st.nextToken());
+					manageHtml(activeChar, grandBossId);
+				}
+				else
+				{
+					NpcHtmlMessage html = new NpcHtmlMessage(0, 1);
+					html.setHtml(HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/admin/grandboss.htm"));
+					activeChar.sendPacket(html);
+				}
+				break;
+			}
+			
+			case "admin_grandboss_skip":
+			{
+				if (st.hasMoreTokens())
+				{
+					final int grandBossId = Integer.parseInt(st.nextToken());
+					
+					if (grandBossId == ANTHARAS)
+					{
+						antharasAi().notifyEvent("SKIP_WAITING", null, activeChar);
+						manageHtml(activeChar, grandBossId);
+					}
+					else
+					{
+						activeChar.sendMessage("Wrong ID!");
+					}
+				}
+				else
+				{
+					activeChar.sendMessage("Usage: //grandboss_skip Id");
+				}
+				break;
+			}
+			case "admin_grandboss_respawn":
+			{
+				if (st.hasMoreTokens())
+				{
+					final int grandBossId = Integer.parseInt(st.nextToken());
+					
+					if (grandBossId == ANTHARAS)
+					{
+						antharasAi().notifyEvent("RESPAWN_ANTHARAS", null, activeChar);
+						manageHtml(activeChar, grandBossId);
+					}
+					else
+					{
+						activeChar.sendMessage("Wrong ID!");
+					}
+				}
+				else
+				{
+					activeChar.sendMessage("Usage: //grandboss_respawn Id");
+				}
+				break;
+			}
+			case "admin_grandboss_minions":
+			{
+				if (st.hasMoreTokens())
+				{
+					final int grandBossId = Integer.parseInt(st.nextToken());
+					
+					if (grandBossId == ANTHARAS)
+					{
+						antharasAi().notifyEvent("DESPAWN_MINIONS", null, activeChar);
+						manageHtml(activeChar, grandBossId);
+					}
+					else
+					{
+						activeChar.sendMessage("Wrong ID!");
+					}
+				}
+				else
+				{
+					activeChar.sendMessage("Usage: //grandboss_minions Id");
+				}
+				break;
+			}
+			case "admin_grandboss_abort":
+			{
+				if (st.hasMoreTokens())
+				{
+					final int grandBossId = Integer.parseInt(st.nextToken());
+					
+					if (grandBossId == ANTHARAS)
+					{
+						antharasAi().notifyEvent("ABORT_FIGHT", null, activeChar);
+						manageHtml(activeChar, grandBossId);
+					}
+					else
+					{
+						activeChar.sendMessage("Wrong ID!");
+					}
+				}
+				else
+				{
+					activeChar.sendMessage("Usage: //grandboss_abort Id");
+				}
+			}
+				break;
+		}
+		return true;
+	}
+	
+	private void manageHtml(L2PcInstance activeChar, int grandBossId)
+	{
+		if (Arrays.asList(ANTHARAS, VALAKAS, BAIUM, QUEENANT, ORFEN, CORE).contains(grandBossId))
+		{
+			final int bossStatus = GrandBossManager.getInstance().getBossStatus(grandBossId);
+			L2NoRestartZone bossZone = null;
+			String textColor = null;
+			String text = null;
+			String htmlPatch = null;
+			int deadStatus = 0;
+			
+			switch (grandBossId)
+			{
+				case ANTHARAS:
+				{
+					bossZone = ZoneManager.getInstance().getZoneById(ANTHARAS_ZONE, L2NoRestartZone.class);
+					htmlPatch = "data/html/admin/grandboss_antharas.htm";
+					deadStatus = 3;
+					
+					switch (bossStatus)
+					{
+						case 0:
+						{
+							textColor = "00FF00"; // Green
+							text = "Alive";
+							break;
+						}
+						case 1:
+						{
+							textColor = "FFFF00"; // Yellow
+							text = "Waiting";
+							break;
+						}
+						case 2:
+						{
+							textColor = "FF9900"; // Orange
+							text = "In Fight";
+							break;
+						}
+						case 3:
+						{
+							textColor = "FF0000"; // Red
+							text = "Dead";
+							break;
+						}
+					}
+					break;
+				}
+				case VALAKAS:
+				{
+					htmlPatch = "data/html/admin/grandboss_valakas.htm";
+					deadStatus = 3;
+					
+					switch (bossStatus)
+					{
+						case 0:
+						{
+							textColor = "00FF00"; // Green
+							text = "Alive";
+							break;
+						}
+						case 1:
+						{
+							textColor = "FFFF00"; // Yellow
+							text = "Waiting";
+							break;
+						}
+						case 2:
+						{
+							textColor = "FF9900"; // Orange
+							text = "In Fight";
+							break;
+						}
+						case 3:
+						{
+							textColor = "FF0000"; // Red
+							text = "Dead";
+							break;
+						}
+					}
+					break;
+				}
+				case BAIUM:
+				{
+					htmlPatch = "data/html/admin/grandboss_baium.htm";
+					deadStatus = 2;
+					
+					switch (bossStatus)
+					{
+						case 0:
+						{
+							textColor = "00FF00"; // Green
+							text = "Alive";
+							break;
+						}
+						case 1:
+						{
+							textColor = "FF9900"; // Orange
+							text = "In Fight";
+							break;
+						}
+						case 2:
+						{
+							textColor = "FF0000"; // Red
+							text = "Dead";
+							break;
+						}
+					}
+					break;
+				}
+				case QUEENANT:
+				{
+					htmlPatch = "data/html/admin/grandboss_queenant.htm";
+					deadStatus = 1;
+					
+					switch (bossStatus)
+					{
+						case 0:
+						{
+							textColor = "00FF00"; // Green
+							text = "Alive";
+							break;
+						}
+						case 1:
+						{
+							textColor = "FF0000"; // Red
+							text = "Dead";
+							break;
+						}
+					}
+					
+					break;
+				}
+				case ORFEN:
+				{
+					htmlPatch = "data/html/admin/grandboss_orfen.htm";
+					deadStatus = 1;
+					
+					switch (bossStatus)
+					{
+						case 0:
+						{
+							textColor = "00FF00"; // Green
+							text = "Alive";
+							break;
+						}
+						case 1:
+						{
+							textColor = "FF0000"; // Red
+							text = "Dead";
+							break;
+						}
+					}
+					break;
+				}
+				case CORE:
+				{
+					htmlPatch = "data/html/admin/grandboss_core.htm";
+					deadStatus = 1;
+					
+					switch (bossStatus)
+					{
+						case 0:
+						{
+							textColor = "00FF00"; // Green
+							text = "Alive";
+							break;
+						}
+						case 1:
+						{
+							textColor = "FF0000"; // Red
+							text = "Dead";
+							break;
+						}
+					}
+					break;
+				}
+			}
+			final StatsSet info = GrandBossManager.getInstance().getStatsSet(grandBossId);
+			final String bossRespawn = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(info.getLong("respawn_time"));
+			
+			NpcHtmlMessage html = new NpcHtmlMessage(0, 1);
+			html.setHtml(HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), htmlPatch));
+			html.replace("%bossStatus%", text);
+			html.replace("%bossColor%", textColor);
+			html.replace("%respawnTime%", bossStatus == deadStatus ? bossRespawn : "Already respawned!");
+			html.replace("%playersInside%", bossZone != null ? String.valueOf(bossZone.getPlayersInside().size()) : "Zone not found!");
+			activeChar.sendPacket(html);
+		}
+		else
+		{
+			activeChar.sendMessage("Wrong ID!");
+		}
+	}
+	
+	private Quest antharasAi()
+	{
+		return QuestManager.getInstance().getQuest(Antharas.class.getSimpleName());
+	}
+	
+	@Override
+	public String[] getAdminCommandList()
+	{
+		return ADMIN_COMMANDS;
+	}
+}
diff --git a/L2J_DataPack_BETA/dist/game/data/zones/custom_boss.xml b/L2J_DataPack_BETA/dist/game/data/zones/custom_boss.xml
index a271f0b586..7bd364ff35 100644
--- a/L2J_DataPack_BETA/dist/game/data/zones/custom_boss.xml
+++ b/L2J_DataPack_BETA/dist/game/data/zones/custom_boss.xml
@@ -9,13 +9,6 @@
 		<node X="57669" Y="221683" />
 		<node X="50773" Y="221632" />
 	</zone>
-	<zone name="Antharas Boss" id="12001" type="BossZone" shape="NPoly" minZ="-8380" maxZ="-4880">
-		<stat name="InvadeTime" val="1800000" />
-		<node X="173469" Y="110431" />
-		<node X="188081" Y="110284" />
-		<node X="188132" Y="119249" />
-		<node X="173386" Y="119391" />
-	</zone>
 	<zone name="Baium Boss" id="12002" type="BossZone" shape="NPoly" minZ="10061" maxZ="11061">
 		<stat name="InvadeTime" val="1800000" />
 		<node X="111022" Y="16177" />
diff --git a/L2J_DataPack_BETA/dist/game/data/zones/no_restart.xml b/L2J_DataPack_BETA/dist/game/data/zones/no_restart.xml
index a3ececf1b4..217859293b 100644
--- a/L2J_DataPack_BETA/dist/game/data/zones/no_restart.xml
+++ b/L2J_DataPack_BETA/dist/game/data/zones/no_restart.xml
@@ -9,7 +9,7 @@
 		<node X="57669" Y="221683" />
 		<node X="50773" Y="221632" />
 	</zone>
-	<zone name="antaras_no_restart" type="NoRestartZone" shape="NPoly" minZ="-8380" maxZ="-4880"> <!-- 25_21 -->
+	<zone name="antaras_no_restart" id="70050" type="NoRestartZone" shape="NPoly" minZ="-8380" maxZ="-4880"> <!-- 25_21 -->
 		<stat name="restartTime" val="1800" />
 		<stat name="restartAllowedTime" val="600" />
 		<node X="173469" Y="110431" />
diff --git a/L2J_DataPack_BETA/dist/sql/game/grandboss_data.sql b/L2J_DataPack_BETA/dist/sql/game/grandboss_data.sql
index 99c809271d..b70c528ae4 100644
--- a/L2J_DataPack_BETA/dist/sql/game/grandboss_data.sql
+++ b/L2J_DataPack_BETA/dist/sql/game/grandboss_data.sql
@@ -20,8 +20,8 @@ INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`
 (29022, 55312, 219168, -3223, 0, 858518.36, 399600), -- Zaken (60)
 -- (29025, 0, 0, 0, 0, 0, 0), -- Baium (Stone) (75)
 (29028, -105200, -253104, -15264, 0, 62041918, 2248572), -- Valakas (85)
-(29066, 185708, 114298, -8221,32768, 14518000, 3996000), -- Antharas Weak (79)
-(29067, 185708, 114298, -8221,32768, 16184000, 3996000), -- Antharas Normal (79)
+-- (29066, 185708, 114298, -8221,32768, 14518000, 3996000), -- Antharas Weak (79)
+-- (29067, 185708, 114298, -8221,32768, 16184000, 3996000), -- Antharas Normal (79)
 (29068, 185708, 114298, -8221,32768, 62802301, 1998000), -- Antharas Strong (85)
 (29118, 0, 0, 0, 0, 4109288, 1220547); -- Beleth (83)
 -- (29045, -87780, -155086, -9080, 16384, 1018821.42723286, 52001.06567747795), -- Frintezza (85)
diff --git a/L2J_DataPack_BETA/dist/sql/game/herb_droplist_groups.sql b/L2J_DataPack_BETA/dist/sql/game/herb_droplist_groups.sql
index d66cf8a91c..f2979674bf 100644
--- a/L2J_DataPack_BETA/dist/sql/game/herb_droplist_groups.sql
+++ b/L2J_DataPack_BETA/dist/sql/game/herb_droplist_groups.sql
@@ -129,4 +129,10 @@ INSERT INTO `herb_droplist_groups` VALUES
 (6,8614,1,1,5,3400), -- Herb of Recovery
 (6,8611,1,1,6,103400), -- Herb of Speed
 (6,10657,1,1,6,3300), -- Herb of Doubt
-(6,10655,1,1,7,450000); -- Herb of Vampiric Rage
+(6,10655,1,1,7,450000), -- Herb of Vampiric Rage
+-- Antharas minions - Behemoth and Tarask Dragon
+(7,8952,10,20,1,1000000), -- Greater Herb of Life
+(7,8953,10,20,2,1000000), -- Greater Herb of Mana
+-- Antharas minions - Dragon Bomber
+(8,8952,10,20,1,1000000), -- Greater Herb of Life
+(8,8953,10,20,2,1000000); -- Greater Herb of Mana
diff --git a/L2J_DataPack_BETA/dist/sql/game/npc.sql b/L2J_DataPack_BETA/dist/sql/game/npc.sql
index 9d16e07abf..553228c0e6 100644
--- a/L2J_DataPack_BETA/dist/sql/game/npc.sql
+++ b/L2J_DataPack_BETA/dist/sql/game/npc.sql
@@ -6219,8 +6219,8 @@ INSERT INTO `npc` VALUES
 (29066, 29066, "Antharas", 0, "", 0, "LineageMonster.antaras", 300, 300, 79, "male", "L2GrandBoss", 40, 6100000, 1800000, 1100, 1000, 60, 57, 73, 76, 70, 80, 262720918, 29116376, 4900, 3456, 2550, 862.5, 253, 4, 333, 0, 0, 0, 50, 186, 0, 1),
 (29067, 29067, "Antharas", 0, "", 0, "LineageMonster.antaras", 300, 300, 79, "male", "L2GrandBoss", 40, 6800000, 1800000, 1100, 1000, 60, 57, 73, 76, 70, 80, 354676030, 39307416, 4900, 3456, 2550, 862.5, 253, 4, 333, 0, 0, 0, 50, 186, 0, 1),
 (29068, 29068, "Antharas", 0, "Earth Dragon", 0, "LineageMonster.antaras", 300, 300, 85, "male", "L2GrandBoss", 40, 26387521.42857, 900000, 1830, 1000, 60, 57, 73, 76, 70, 80, 538538585, 63323403, 4799.20533, 3974.13793, 263.60854, 496.01325, 253, 4, 333, 0, 0, 0, 50, 186, 0, 1),
-(29069, 29069, "Behemoth Dragon", 0, "", 0, "LineageMonster3.antaras_ex_a", 63, 54, 85, "male", "L2Monster", 40, 401551.69672, 1809, 76.71, 3, 60, 57, 73, 76, 70, 80, 0, 0, 3584.56902, 1071.29474, 1386.66, 522.62686, 253, 4, 333, 0, 0, 0, 180, 180, 0, 1),
-(29070, 29070, "Dragon Bomber", 0, "", 0, "LineageMonster3.antaras_ex_b_80p", 37, 28, 85, "male", "L2Monster", 40, 1353.6766, 1809, 8.5, 3, 60, 57, 73, 76, 70, 80, 0, 0, 1094.11758, 357.09825, 4902.24, 261.309, 253, 4, 333, 0, 0, 0, 200, 250, 0, 1),
+(29069, 29069, "Behemoth Dragon", 0, "", 0, "LineageMonster3.antaras_ex_a", 63, 54, 85, "male", "L2Monster", 40, 401551.69672, 1809, 76.71, 3, 60, 57, 73, 76, 70, 80, 0, 0, 3584.56902, 1071.29474, 1386.66, 522.62686, 253, 4, 333, 0, 0, 0, 180, 180, 7, 1),
+(29070, 29070, "Dragon Bomber", 0, "", 0, "LineageMonster3.antaras_ex_b_80p", 37, 28, 85, "male", "L2Monster", 40, 1353.6766, 1809, 8.5, 3, 60, 57, 73, 76, 70, 80, 0, 0, 1094.11758, 357.09825, 4902.24, 261.309, 253, 4, 333, 0, 0, 0, 200, 250, 8, 1),
 (29071, 29071, "Dragon Bomber", 0, "", 0, "LineageMonster3.antaras_ex_b_80p", 37, 28, 78, "male", "L2Monster", 40, 1000, 1607.4, 8.5, 3, 60, 57, 73, 76, 70, 80, 0, 0, 855.81387, 332.70061, 584.40994, 243.45587, 253, 4, 333, 0, 0, 0, 200, 245, 0, 1),
 (29072, 29072, "Dragon Bomber", 0, "", 0, "LineageMonster3.antaras_ex_b_80p", 37, 28, 78, "male", "L2Monster", 40, 1000, 1607.4, 8.5, 3, 60, 57, 73, 76, 70, 80, 0, 0, 855.81387, 332.70061, 584.40994, 243.45587, 253, 4, 333, 0, 0, 0, 200, 255, 0, 1),
 (29073, 29073, "Dragon Bomber", 0, "", 0, "LineageMonster3.antaras_ex_b_80p", 37, 28, 78, "male", "L2Monster", 40, 1000, 1607.4, 8.5, 3, 60, 57, 73, 76, 70, 80, 0, 0, 855.81387, 332.70061, 584.40994, 243.45587, 253, 4, 333, 0, 0, 0, 200, 247, 0, 1),
@@ -6340,7 +6340,7 @@ INSERT INTO `npc` VALUES
 (29187, 29187, "Crystal Prison Guard", 0, "", 0, "LineageMonster4.eyeless", 36, 43.5, 85, "male", "L2Monster", 40, 18815.573117, 1955.34, 187.367998, 3, 40, 43, 30, 21, 20, 20, 0, 0, 1834.58348, 602.7947, 1252.78269, 441.099, 253, 4, 333, 0, 0, 0, 60, 210, 0, 1),
 (29188, 29188, "Crystal Golem", 0, "", 0, "LineageMonster4.Crystal_Golem", 34, 47, 85, "male", "L2Monster", 40, 114631.265523, 1846.8, 187.367998, 3, 40, 43, 30, 21, 20, 20, 0, 0, 983.0479, 361.78814, 671.29428, 264.74086, 253, 4, 333, 0, 0, 0, 54, 170, 0, 1),
 (29189, 29189, "Crystal Golem", 0, "", 0, "LineageMonster4.Crystal_Golem", 34, 47, 85, "male", "L2Monster", 40, 3046.70947, 1846.8, 8.5, 3, 40, 43, 30, 21, 20, 20, 0, 0, 983.0479, 361.78814, 671.29428, 264.74086, 253, 4, 333, 0, 0, 0, 54, 170, 0, 1),
-(29190, 29190, "Tarask Dragon", 0, "", 0, "LineageMonster3.antaras_ex_a", 63, 54, 85, "male", "L2Monster", 40, 401551.69672, 1809, 76.71, 3, 60, 57, 73, 76, 70, 80, 0, 0, 3584.56902, 1071.29474, 1386.66, 522.62686, 253, 4, 333, 0, 0, 0, 180, 180, 0, 1),
+(29190, 29190, "Tarask Dragon", 0, "", 0, "LineageMonster3.antaras_ex_a", 63, 54, 85, "male", "L2Monster", 40, 401551.69672, 1809, 76.71, 3, 60, 57, 73, 76, 70, 80, 0, 0, 3584.56902, 1071.29474, 1386.66, 522.62686, 253, 4, 333, 0, 0, 0, 180, 180, 7, 1),
 (30001, 30001, "Lector", 0, "Weapon Merchant", 0, "LineageNPC.a_traderA_MHuman", 10, 24, 70, "male", "L2Merchant", 40, 2444.46819, 1345.8, 7.5, 2.7, 40, 43, 30, 21, 20, 20, 0, 0, 688.86373, 295.91597, 470.40463, 216.53847, 253, 4, 333, 0, 0, 0, 50, 120, 0, 1),
 (30002, 30002, "Jackson", 0, "Armor Merchant", 0, "LineageNPC.a_traderB_MHuman", 8, 25, 70, "male", "L2Merchant", 40, 2444.46819, 1345.8, 7.5, 2.7, 40, 43, 30, 21, 20, 20, 0, 0, 688.86373, 295.91597, 470.40463, 216.53847, 253, 4, 333, 0, 0, 0, 50, 120, 0, 1),
 (30003, 30003, "Silvia", 0, "Accessory Merchant", 0, "LineageNPC.a_traderA_FHuman", 7, 23, 70, "female", "L2Merchant", 40, 2444.46819, 1345.8, 7.5, 2.7, 40, 43, 30, 21, 20, 20, 0, 0, 688.86373, 295.91597, 470.40463, 216.53847, 253, 4, 333, 0, 0, 0, 50, 120, 0, 1),
diff --git a/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql b/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql
index 575698aa8c..caf1bc40f4 100644
--- a/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql
+++ b/L2J_DataPack_BETA/dist/sql/game/npcaidata.sql
@@ -6203,7 +6203,7 @@ INSERT INTO `npcaidata` VALUES
 (29065, 7, 15, 0, 1000, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "balanced"), -- Sailren
 (29066, 7, 25, 0, 4096, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "balanced"), -- Antharas
 (29067, 7, 25, 0, 4096, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "balanced"), -- Antharas
-(29068, 7, 25, 0, 4096, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "balanced"), -- Antharas
+(29068, 7, 25, 4112, 4096, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "null", 300, "null", 0, 0, "balanced"), -- Antharas
 (29069, 7, 25, 0, 1000, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, "null", 300, "null", 0, 0, "balanced"), -- Behemoth Dragon
 (29070, 7, 15, 0, 100, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, "null", 300, "null", 0, 0, "balanced"), -- Dragon Bomber
 (29071, 7, 15, 0, 100, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 900, 0, "null", 300, "null", 0, 0, "balanced"), -- Dragon Bomber
diff --git a/L2J_DataPack_BETA/dist/sql/game/npcskills.sql b/L2J_DataPack_BETA/dist/sql/game/npcskills.sql
index 83b60f98f4..b258f5904b 100644
--- a/L2J_DataPack_BETA/dist/sql/game/npcskills.sql
+++ b/L2J_DataPack_BETA/dist/sql/game/npcskills.sql
@@ -76080,6 +76080,7 @@ INSERT INTO `npcskills` VALUES
 (29068, 4415, 3), -- Weapon Type
 (29068, 4416, 10), -- Races
 (29068, 5465, 1), -- Earth Attacks
+(29068, 4112, 1), -- Ordinary Attack
 -- Behemoth Dragon
 (29069, 4045, 1), -- Resist Full Magic Attack
 (29069, 4408, 1), -- HP Modifiers
diff --git a/L2J_DataPack_BETA/dist/sql/game/updates/20140116update.sql b/L2J_DataPack_BETA/dist/sql/game/updates/20140116update.sql
new file mode 100644
index 0000000000..51217c8337
--- /dev/null
+++ b/L2J_DataPack_BETA/dist/sql/game/updates/20140116update.sql
@@ -0,0 +1,2 @@
+DELETE FROM grandboss_data WHERE boss_id = "29066";
+DELETE FROM grandboss_data WHERE boss_id = "29067";
\ No newline at end of file
-- 
GitLab