Bladeren bron

BETA: The Hellbound Datapack part!
* Implemented Quests:
1. Matras' Curiosity(132)
1. Target of Opportunity(279)
1. Jude's Request(690)
1. Matras' Suspicious Request(691)
* Implemented Teleports:
1. Steel Citadel
1. Warpgate
* Implemented AIs:
1. Chimeras
1. RandomSpawn
1. Remnants
1. Sandstorms
1. Slaves
1. Amaskari
1. Beleth
1. DemonPrince
1. Epidos
1. HellboundCore
1. Keltas
1. NaiaLock
1. OutpostCaptain
1. Ranku
1. SinWardens
1. Typhoon
1. AnomicFoundry
1. BaseTower
1. Bernarde
1. Buron
1. Deltuva
1. Falk
1. Hude
1. Jude
1. Kanaf
1. Kief
1. Natives
1. Quarry
1. Shadai
1. Solomon
1. TowerOfInfinitum
1. TowerOfNaia
1. TullyWorkshop
* Implemented Instances:
1. DemonPrinceFloor
1. HellboundTown
1. RankuFloor
* Implemented Admin Commands:
1. //hellbound_setlevel
1. //hellbound
* Implemented Voiced Commands:
1. .hellbound
'''Note:''' This game feature was developed by many users:

Special Thanks:

'''theone''' first Jython implementation.

'''_DS_''' first Java implementation.

'''VlLight''' as '''GKR''' AI, Quests, Engine and more.

'''Treat''' Beleth Grand Boss AI.

Thanks:
Gladicek
malyelfik
plim
u3games
Ectis
MELERIX
badboy29
dastak
Asker64
RiZe
pmq
UnAfraid
Schleuse

Testers:
Dumpster
DareStrike
sam.jr
kostantinos
goncafa
jamaica
pandragon
pinkcore
bomberoloco24
blacksea
swg
IMBAL
mystirio
hackstyle

Code review, cleanup, code refactoring, typo fixing by me.

Zoey76 13 jaren geleden
bovenliggende
commit
38ce17b8e9
100 gewijzigde bestanden met toevoegingen van 4853 en 46 verwijderingen
  1. 5 0
      L2J_DataPack_BETA/dist/game/data/Routes.txt
  2. 92 0
      L2J_DataPack_BETA/dist/game/data/Routes.xml
  3. 49 0
      L2J_DataPack_BETA/dist/game/data/Routes.xsd
  4. 7 0
      L2J_DataPack_BETA/dist/game/data/html/admin/game_menu.htm
  5. 85 0
      L2J_DataPack_BETA/dist/game/data/html/admin/hellbound.htm
  6. 23 0
      L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/basetower.htm
  7. 34 23
      L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/hellbound.htm
  8. 30 0
      L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/toinf.htm
  9. 24 0
      L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/tully.htm
  10. 10 0
      L2J_DataPack_BETA/dist/game/data/html/default/32302.htm
  11. 5 0
      L2J_DataPack_BETA/dist/game/data/html/default/32307.htm
  12. 1 1
      L2J_DataPack_BETA/dist/game/data/html/default/32313.htm
  13. 6 0
      L2J_DataPack_BETA/dist/game/data/html/default/32343.htm
  14. 6 4
      L2J_DataPack_BETA/dist/game/data/html/default/32346.htm
  15. 12 0
      L2J_DataPack_BETA/dist/game/data/html/default/32364-1.htm
  16. 9 0
      L2J_DataPack_BETA/dist/game/data/html/default/32364-2.htm
  17. 11 0
      L2J_DataPack_BETA/dist/game/data/html/default/32364-3.htm
  18. 8 0
      L2J_DataPack_BETA/dist/game/data/html/default/32364-4.htm
  19. 8 0
      L2J_DataPack_BETA/dist/game/data/html/default/32364.htm
  20. 9 0
      L2J_DataPack_BETA/dist/game/data/html/default/32373.htm
  21. 6 0
      L2J_DataPack_BETA/dist/game/data/html/default/32374.htm
  22. 6 0
      L2J_DataPack_BETA/dist/game/data/html/default/32375.htm
  23. 6 0
      L2J_DataPack_BETA/dist/game/data/html/default/32376.htm
  24. 6 0
      L2J_DataPack_BETA/dist/game/data/html/default/32745.htm
  25. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32746.htm
  26. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32747.htm
  27. 8 0
      L2J_DataPack_BETA/dist/game/data/html/default/32748.htm
  28. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32749.htm
  29. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32750.htm
  30. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32751.htm
  31. 8 0
      L2J_DataPack_BETA/dist/game/data/html/default/32752.htm
  32. 6 0
      L2J_DataPack_BETA/dist/game/data/html/default/32753.htm
  33. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32754.htm
  34. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32755.htm
  35. 7 0
      L2J_DataPack_BETA/dist/game/data/html/default/32756.htm
  36. 11 0
      L2J_DataPack_BETA/dist/game/data/html/merchant/32347-1.htm
  37. 4 1
      L2J_DataPack_BETA/dist/game/data/html/merchant/32347.htm
  38. 10 0
      L2J_DataPack_BETA/dist/game/data/instances/DemonPrince.xml
  39. 63 0
      L2J_DataPack_BETA/dist/game/data/instances/HellboundTown.xml
  40. 10 0
      L2J_DataPack_BETA/dist/game/data/instances/Ranku.xml
  41. 8 0
      L2J_DataPack_BETA/dist/game/data/multisell/322980001.xml
  42. 624 0
      L2J_DataPack_BETA/dist/game/data/multisell/322980002.xml
  43. 6 6
      L2J_DataPack_BETA/dist/game/data/multisell/323470001.xml
  44. 8 8
      L2J_DataPack_BETA/dist/game/data/multisell/323470002.xml
  45. 42 0
      L2J_DataPack_BETA/dist/game/data/scripts.cfg
  46. 147 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Chimeras.java
  47. 5 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/L2AttackableAIScript.java
  48. 179 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/RandomSpawn.java
  49. 91 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Remnants.java
  50. 49 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Sandstorms.java
  51. 99 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Slaves.java
  52. 181 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Amaskari.java
  53. 817 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Beleth.java
  54. 130 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DemonPrince.java
  55. 136 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Epidos.java
  56. 72 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/HellboundCore.java
  57. 297 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Keltas.java
  58. 48 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/NaiaLock.java
  59. 96 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/OutpostCaptain.java
  60. 130 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Ranku.java
  61. 82 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinWardens.java
  62. 81 0
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Typhoon.java
  63. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java
  64. 87 0
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminHellbound.java
  65. 50 0
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/voicedcommandhandlers/Hellbound.java
  66. 315 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AnomicFoundry/AnomicFoundry.java
  67. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/BaseTower/32301-01.htm
  68. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/BaseTower/32301-02.htm
  69. 124 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/BaseTower/BaseTower.java
  70. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01.htm
  71. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01a.htm
  72. 9 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01c.htm
  73. 9 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01d.htm
  74. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01f.htm
  75. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02.htm
  76. 9 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02a.htm
  77. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02b.htm
  78. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02c.htm
  79. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02d.htm
  80. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02e.htm
  81. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-03.htm
  82. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-10r.htm
  83. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-11r.htm
  84. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-1r.htm
  85. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-2r.htm
  86. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-3r.htm
  87. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-4r.htm
  88. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-5r.htm
  89. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-6r.htm
  90. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-7r.htm
  91. 7 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-8r.htm
  92. 7 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-9r.htm
  93. 114 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/Bernarde.java
  94. 6 2
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Budenka/Budenka.java
  95. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-01.htm
  96. 11 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-01a.htm
  97. 10 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-02.htm
  98. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-10r.htm
  99. 5 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-11r.htm
  100. 6 0
      L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-1r.htm

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/Routes.txt

@@ -0,0 +1,5 @@
+Possible "repeatStyle" are:
+- "back": NPC moves from first point to last point, then moves back through last point but one, and so on to the first point.
+- "cycle": NPC moves from first point to last point, then moves directly to the first point.
+- "conveyor": NPC moves from first point to last point, then teleports directly to the first point.
+- "random": NPC randomly moves between points.

+ 92 - 0
L2J_DataPack_BETA/dist/game/data/Routes.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Routes.xsd">
+	<!-- Just test route - Giran town square -->
+	<route id="1" repeat="true" repeatStyle="cycle">
+		<stat name="debug" val="false" />
+		<point string="" X="80863" Y="148339" Z="-3469" delay="0" run="true" />
+		<point string="" X="80904" Y="147653" Z="-3469" delay="0" run="true" />
+		<point string="" X="83205" Y="147646" Z="-3469" delay="0" run="true" />
+		<point string="" X="82189" Y="148347" Z="-3467" delay="0" run="true" />
+		<point string="" X="81862" Y="148266" Z="-3467" delay="0" run="true" />
+		<point string="" X="81918" Y="148352" Z="-3467" delay="0" run="true" />
+		<point string="" X="81937" Y="149173" Z="-3469" delay="0" run="true" />
+	</route>
+	<!-- Hellbound Town routes for Patrols -->
+	<!-- castletownguard01 -->
+	<route id="2" repeat="true" repeatStyle="random">
+		<point string="" X="14840" Y="251949" Z="-1992" delay="0" run="false" />
+		<point string="" X="14679" Y="253399" Z="-2016" delay="0" run="false" />
+	</route>
+	<!-- castletownguard02 -->
+	<route id="3" repeat="true" repeatStyle="random">
+		<point string="" X="16082" Y="251790" Z="-1992" delay="0" run="false" />
+		<point string="" X="16388" Y="252456" Z="-2000" delay="0" run="false" />
+		<point string="" X="16093" Y="254443" Z="-2064" delay="0" run="false" />
+	</route>
+	<!-- castletownguard03 -->
+	<route id="4" repeat="true" repeatStyle="random">
+		<point string="" X="16524" Y="255244" Z="-2072" delay="0" run="false" />
+		<point string="" X="17211" Y="256290" Z="-2064" delay="0" run="false" />
+		<point string="" X="18805" Y="256302" Z="-2088" delay="0" run="false" />
+	</route>
+	<!-- castletownguard04 -->
+	<route id="5" repeat="true" repeatStyle="random">
+		<point string="" X="17344" Y="251070" Z="-1952" delay="0" run="false" />
+		<point string="" X="18708" Y="250659" Z="-1992" delay="0" run="false" />
+		<point string="" X="19533" Y="250667" Z="-2016" delay="0" run="false" />
+	</route>
+	<!-- Anomic Foundry routes for Lesser and Greater Evil -->
+	<!-- malign_conveyor_1_1 -->
+	<route id="6" repeat="true" repeatStyle="conveyor">
+		<point string="" X="27886" Y="248609" Z="-3208" delay="0" run="true" />
+		<point string="" X="28150" Y="247726" Z="-3272" delay="0" run="true" />
+		<point string="" X="27340" Y="246649" Z="-3680" delay="0" run="true" />
+		<point string="" X="27646" Y="245922" Z="-3672" delay="0" run="true" />
+		<!-- <point string="" X="28247" Y="245907" Z="-2552" delay="0" run="true" /> --> <!-- retail -->
+		<point string="" X="28070" Y="245920" Z="-3698" delay="0" run="true" /> <!-- custom -->
+		<point string="" X="28491" Y="245926" Z="-3698" delay="0" run="true" /> <!-- custom -->
+		<point string="" X="29074" Y="245889" Z="-3672" delay="0" run="true" />
+		<point string="" X="29182" Y="244811" Z="-3688" delay="0" run="true" />
+		<point string="" X="28925" Y="244462" Z="-3698" delay="0" run="true" /> <!-- custom -->
+		<!-- <point string="" X="28770" Y="244248" Z="-2496" delay="0" run="true" /> --> <!-- retail -->
+	</route>
+	<!-- malign_conveyor_1_2 -->
+	<route id="7" repeat="true" repeatStyle="conveyor">
+		<point string="" X="26144" Y="246444" Z="-3208" delay="0" run="true" />
+		<point string="" X="28063" Y="247940" Z="-3248" delay="0" run="true" />
+		<point string="" X="28276" Y="247756" Z="-3272" delay="0" run="true" />
+		<point string="" X="27344" Y="246649" Z="-3680" delay="0" run="true" />
+		<point string="" X="27652" Y="245914" Z="-3688" delay="0" run="true" />
+		<!-- <point string="" X="28255" Y="245912" Z="-2552" delay="0" run="true" /> --> <!-- retail -->
+		<point string="" X="28058" Y="245915" Z="-3701" delay="0" run="true" /> <!-- custom -->
+	</route>
+	<!-- malign_conveyor_1_3 -->
+	<route id="8" repeat="true" repeatStyle="conveyor">
+		<point string="" X="27336" Y="246216" Z="-3656" delay="0" run="true" />
+		<point string="" X="27645" Y="245921" Z="-3672" delay="0" run="true" />
+		<!-- <point string="" X="28245" Y="245904" Z="-2552" delay="0" run="true" /> --> <!-- retail -->
+		<point string="" X="28058" Y="245915" Z="-3701" delay="0" run="true" /> <!-- custom -->
+	</route>
+	<!-- malign_conveyor_1_4 -->
+	<route id="9" repeat="true" repeatStyle="conveyor">
+		<point string="" X="28476" Y="245914" Z="-3696" delay="0" run="true" />
+		<point string="" X="29058" Y="245894" Z="-3672" delay="0" run="true" />
+		<point string="" X="29433" Y="245216" Z="-3688" delay="0" run="true" />
+		<point string="" X="28942" Y="244492" Z="-3696" delay="0" run="true" />
+	</route>
+	<!-- malign_conveyor_2_1 -->
+	<route id="10" repeat="true" repeatStyle="conveyor">
+		<point string="" X="28771" Y="244251" Z="-2496" delay="0" run="true" />
+		<point string="" X="28495" Y="243839" Z="-3696" delay="0" run="true" />
+		<point string="" X="28727" Y="242939" Z="-3592" delay="0" run="true" />
+		<point string="" X="28188" Y="242512" Z="-3464" delay="0" run="true" />
+		<point string="" X="27248" Y="242797" Z="-3168" delay="0" run="true" />
+		<point string="" X="26850" Y="243834" Z="-2896" delay="0" run="true" />
+		<point string="" X="24636" Y="246593" Z="-1968" delay="0" run="true" />
+		<point string="" X="24519" Y="248586" Z="-1936" delay="0" run="true" />
+		<point string="" X="23094" Y="250031" Z="-1976" delay="0" run="true" />
+		<point string="" X="22673" Y="251605" Z="-1992" delay="0" run="true" />
+		<point string="" X="24560" Y="254414" Z="-1984" delay="0" run="true" />
+		<point string="" X="25392" Y="255459" Z="-1992" delay="0" run="true" />
+	</route>
+</routes>

+ 49 - 0
L2J_DataPack_BETA/dist/game/data/Routes.xsd

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+	<xs:element name="routes">
+		<xs:complexType>
+			<xs:sequence minOccurs="1" maxOccurs="1">
+				<xs:element name="route" minOccurs="1" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:sequence minOccurs="1" maxOccurs="1">
+							<xs:element name="stat" minOccurs="0" maxOccurs="unbounded">
+								<xs:complexType>
+									<xs:attribute name="name" use="required">
+										<xs:simpleType>
+											<xs:restriction base="xs:token">
+												<xs:enumeration value="debug" />
+											</xs:restriction>
+										</xs:simpleType>
+									</xs:attribute>
+									<xs:attribute name="val" type="xs:token" use="required" />
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="point" minOccurs="1" maxOccurs="unbounded">
+								<xs:complexType>
+									<xs:attribute name="string" type="xs:normalizedString" use="required" />
+									<xs:attribute name="X" type="xs:integer" use="required" />
+									<xs:attribute name="Y" type="xs:integer" use="required" />
+									<xs:attribute name="Z" type="xs:integer" use="required" />
+									<xs:attribute name="run" type="xs:boolean" use="required" />
+									<xs:attribute name="delay" type="xs:integer" use="required" />
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+						<xs:attribute name="id" type="xs:positiveInteger" use="required" />
+						<xs:attribute name="repeat" type="xs:boolean" use="required" />
+						<xs:attribute name="repeatStyle" use="required" >
+							<xs:simpleType>
+									<xs:restriction base="xs:token">
+										<xs:enumeration value="back" />
+										<xs:enumeration value="cycle" />
+										<xs:enumeration value="conveyor" />
+										<xs:enumeration value="random" />
+									</xs:restriction>
+								</xs:simpleType>
+						</xs:attribute>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+</xs:schema>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/admin/game_menu.htm

@@ -70,6 +70,13 @@ Gracia Seeds:<br1>
 </tr>
 </table>
 <br>
+Hellbound Continent:<br1>
+<table width=125>
+<tr>
+<td><button value="Hellbound Info" action="bypass -h admin_hellbound" width=125 height=20 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
+</tr>
+</table>
+<br>
 Olympiad:<br1>
 <table width=250>
 <tr>

+ 85 - 0
L2J_DataPack_BETA/dist/game/data/html/admin/hellbound.htm

@@ -0,0 +1,85 @@
+<html>
+<title>L2J Hellbound Menu</title>
+<body>
+	<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">Hellbound Continent Informations</font><br>
+	</center>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>Stage:</td>
+			<td>%hbstage%</td>
+		</tr>
+		<tr>
+			<td>Trust:</td>
+			<td>%trust%</td>
+		</tr>
+		<tr>
+			<td>Max.Trust:</td>
+			<td>%maxtrust%</td>
+		</tr>
+		<tr>
+			<td>Min.Trust:</td>
+			<td>%mintrust%</td>
+		</tr>
+	</table>
+	<br>
+	<table width="270" border="0" bgcolor="444444">
+		<tr>
+			<td>
+				<button value="Stage 0" action="bypass -h admin_hellbound_setlevel 0" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 1" action="bypass -h admin_hellbound_setlevel 1" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 2" action="bypass -h admin_hellbound_setlevel 2" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 3" action="bypass -h admin_hellbound_setlevel 3" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<button value="Stage 4" action="bypass -h admin_hellbound_setlevel 4" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 5" action="bypass -h admin_hellbound_setlevel 5" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 6" action="bypass -h admin_hellbound_setlevel 6" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 7" action="bypass -h admin_hellbound_setlevel 7" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+		</tr>
+		<tr>
+			<td>
+				<button value="Stage 8" action="bypass -h admin_hellbound_setlevel 8" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 10" action="bypass -h admin_hellbound_setlevel 10" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td>
+				<button value="Stage 11" action="bypass -h admin_hellbound_setlevel 11" width="65" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+		</tr>
+	</table>
+</body>
+</html>

+ 23 - 0
L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/basetower.htm

@@ -0,0 +1,23 @@
+<html>
+<title>Admin Teleports</title>
+<body>
+	<center>
+	<table width="260">
+		<tr>
+			<td width="40">
+				<button value="Main" action="bypass -h admin_admin" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+			<td width="180">
+				<center>Base Tower</center>
+			</td>
+			<td width="40">
+				<button value="Back" action="bypass -h admin_help teleports/location/hellbound.htm" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+			</td>
+		</tr>
+	</table>
+	<br>
+	<br>
+	<button action="bypass -h admin_move_to 16278 283653 -9708" value="Anteroom" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+	</center>
+</body>
+</html>

+ 34 - 23
L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/hellbound.htm

@@ -1,24 +1,35 @@
-<html><title>Admin Teleports</title>
+<html>
+<title>Admin Teleports</title>
 <body>
-<center>
-<table width=260>
-<tr><td width=40><button value="Main" action="bypass -h admin_admin" width=40 height=15 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
-<td width=180><center>Hellbound Island</center></td>
-<td width=40><button value="Back" action="bypass -h admin_show_moves" width=40 height=15 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td>
-</tr></table>
-</center>
-<br>
-<br>
-<center>
-<button action="bypass -h admin_move_to -11802 236360 -3271" value="Hellbound Entrance" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to -8391 242342 -1890" value="Hellbound Quarry" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to -22432 243491 -3068" value="Enchanted Megaliths" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to -19715 249356 -3237" value="Hidden Oasis" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to -27289 253838 -2154" value="Ancient Temple Remnants" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to -4156 255301 -3139" value="Caravan Encampment" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to 298 235111 -3273" value="Battered Lands" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to 4706 243939 -1922" value="Iron Castle" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to 8902 251884 -2028" value="Steel Citadel Outpost" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-<button action="bypass -h admin_move_to 26606 248354 -2880" value="Anomic Foundry" width=180 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"><br1>
-</center>
-</body></html>
+	<center>
+		<table width="260">
+			<tr>
+				<td width="40">
+					<button value="Main" action="bypass -h admin_admin" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+				<td width="180">
+					<center>Hellbound Island</center>
+				</td>
+				<td width="40">
+					<button value="Back" action="bypass -h admin_show_moves" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+			</tr>
+		</table>
+		<br>
+		<br>
+		<button action="bypass -h admin_move_to -11802 236360 -3271" value="Hellbound Entrance" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -8391 242342 -1890" value="Hellbound Quarry" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -22432 243491 -3068" value="Enchanted Megaliths" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -19715 249356 -3237" value="Hidden Oasis" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -27289 253838 -2154" value="Ancient Temple Remnants" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -4156 255301 -3139" value="Caravan Encampment" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to 298 235111 -3273" value="Battered Lands" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to 4706 243939 -1922" value="Iron Castle" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to 8902 251884 -2028" value="Steel Citadel Outpost" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to 26606 248354 -2880" value="Anomic Foundry" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_help teleports/location/basetower.htm" value="Base Tower" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_help teleports/location/toinf.htm" value="Tower of Infinitum" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_help teleports/location/tully.htm" value="Tully Workshop" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+	</center>
+</body>
+</html>

+ 30 - 0
L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/toinf.htm

@@ -0,0 +1,30 @@
+<html>
+<title>Admin Teleports</title>
+<body>
+	<center>
+		<table width="260">
+			<tr>
+				<td width="40">
+					<button value="Main" action="bypass -h admin_admin" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+				<td width="180">
+					<center>Tower of Infinitum</center>
+				</td>
+				<td width="40">
+					<button value="Back" action="bypass -h admin_help teleports/location/hellbound.htm" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+			</tr>
+		</table>
+		<br>
+		<br>
+		<button action="bypass -h admin_move_to -22215 277103 -15046" value="Floor 1" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -22258 277112 -13376" value="Floor 2" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -22258 277226 -11648" value="Floor 3" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -22258 277112 -9920" value="Floor 4" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -19074 277112 -8256" value="Floor 6" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -19074 277116 -9920" value="Floor 7" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -19058 277090 -11648" value="Floor 8" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br1>
+		<button action="bypass -h admin_move_to -19068 277074 -13376" value="Floor 9" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+	</center>
+</body>
+</html>

+ 24 - 0
L2J_DataPack_BETA/dist/game/data/html/admin/teleports/location/tully.htm

@@ -0,0 +1,24 @@
+<html>
+<title>Admin Teleports</title>
+<body>
+	<center>
+		<table width="260">
+			<tr>
+				<td width="40">
+					<button value="Main" action="bypass -h admin_admin" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+				</td>
+				<td width="180">
+					<center>Tully Workshop</center>
+				</td>
+				<td width="40">
+					<button value="Back" action="bypass -h admin_help teleports/location/hellbound.htm" width="40" height="15" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
+				</td>
+			</tr>
+		</table>
+		<br>
+		<br>
+		<button action="bypass -h admin_move_to -13400 272827 -15300" value="Floor 1" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" /><br>
+		<button action="bypass -h admin_move_to -12176 279696 -13596" value="Floor 6" width="180" height="21" back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF" />
+	</center>
+</body>
+</html>

+ 10 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32302.htm

@@ -0,0 +1,10 @@
+<html><body>Jerian:<br>
+Welcome! I have waited so long for you to come here. 
+I must tell you that there is a strong magic barrier on the Tower of Infinitum. 
+If someone who is not a devil enters the tower, 
+this magic will be activated and break everything into pieces. 
+The only way to avoid it is to disguise yourself as a devil.<br>
+To do so, you must kill a devil and cover your body with its blood...<br>
+<a action="bypass -h Quest TowerOfInfinitum enter">"Please let me enter."</a><br>
+<a action="bypass -h npc_%objectId%_Quest">Quest.</a>
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32307.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Dolmen:<br>
+It looks like a very old grave -- a good place to sit and rest for a while.
+</body></html>

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/html/default/32313.htm

@@ -1,5 +1,5 @@
 <html><body>Deltuva:<br>
 Welcome, traveler! I am assuming that since you know this place you must have heard about me from someone. I am here to help adventurers secretly enter the Steel Citadel. Unless you are already familiar with the Steel Citadel, however, I cannot permit you to go inside. It is simply too dangerous for the inexperienced. So, then...what would you like to do?<br>
-<a action="bypass -h npc_%objectId%_Chat 0">"Let me into the Steel Citadel."</a><br>
+<a action="bypass -h Quest Deltuva teleport">"Let me into the Steel Citadel."</a><br>
 <a action="bypass -h npc_%objectId%_Quest">Quest.</a>
 </body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32343.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+The stone looks like a tombstone placed at the entrance. There is a small hole at the bottom. <br>
+<a action="bypass -h npc_%objectId%_Quest HellboundTown">Insert the key engraved with the image of an evil eye.</a><br>
+<a action="bypass -h npc_%objectId%_Quest">Quest.</a>
+</body></html>

+ 6 - 4
L2J_DataPack_BETA/dist/game/data/html/default/32346.htm

@@ -1,8 +1,10 @@
 <html><body>Kanaf:<br>
-Shh! Please be still. Over there is the <font color="LEVEL">old town</font>, which is the only entrance to the Steel Citadel. It is used as a prison camp for Native captives.<br>
-Some time ago, when the Steel Citadel's defenses were temporarily weakened, we attacked the town in an attempt to rescue the captives. However, the enemy was still too strong, and many of us were killed or wounded. <br>
+Shh! Please be still. Over there is the <font color="LEVEL">old town</font>, which is the only entrance to the Steel Citadel. 
+It is used as a prison camp for Native captives.<br>
+Some time ago, when the Steel Citadel's defenses were temporarily weakened, we attacked the town in an attempt to rescue the captives. 
+However, the enemy was still too strong, and many of us were killed or wounded.<br>
 And our comrades in the town still thirst for their freedom!<br>
-<a action="bypass -h npc_%objectId%_Chat 0">Infiltrate the town.</a><br>
-<a action="bypass -h npc_%objectId%_Chat 2">Ask him for new information about the town.</a><br>
+<a action="bypass -h npc_%objectId%_Quest HellboundTown">Infiltrate the town.</a><br>
+<a action="bypass -h Quest Kanaf info">Ask him for new information about the town.</a><br>
 <a action="bypass -h npc_%objectId%_Quest">Quest.</a>
 </body></html>

+ 12 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32364-1.htm

@@ -0,0 +1,12 @@
+<html><head>
+<body>
+Hellbound Traitor:<br>
+My brethren act rashly if given even the tiniest bit of freedom. But unless they come to their senses, soon they will not even have the freedom to draw 
+breath!<br>Some may say that the Steel Citadel will soon fall, but that is nonsense. Any recent setbacks it has experienced are as fleeting as the 
+morning dew...<br>
+...<br>
+If you stop to consider how things stand, you cannot deny that there are also great opportunities available for men not afraid to act in their best 
+interests. The Steel Citadel is not without its benefits, you know...<br>
+<a action="bypass -h npc_%objectId%_Chat 2">Ask what he means.</a>
+</body></html>
+

+ 9 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32364-2.htm

@@ -0,0 +1,9 @@
+<html><head>
+<body>
+Hellbound Traitor:<br>
+Well, here is a golden opportunity for an adventurer such as yourself.<br>
+The rebel leader, Commander Leodas, is injured and resting in that room. Now what would happen if strangers burst in and killed him?
+<br>I know for a fact that the ruler of the Steel Citadel would express his gratitude very generously indeed...<br>
+<a action="bypass -h npc_%objectId%_Chat 3">Tell him to open the door.</a>
+</body></html>
+

+ 11 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32364-3.htm

@@ -0,0 +1,11 @@
+<html><head>
+<body>
+Hellbound Traitor:<br>
+Kuhh! You are pretty clever. The Steel Citadel values people of talent like you.<br>
+Look here, you will be rewarded for killing the captain of the Hellbound rebels, but what about me? Don't you think that I deserve a little payment?<br>
+What I need is 10 <font color="LEVEL">Marks of Betrayal</font>.<br>
+Bring me those and I'll gladly open this door.<br>
+<a action="bypass -h Quest Natives open_door">Tell him that you have them.</a><br>
+<a action="bypass -h npc_%objectId%_Chat 4">Threaten him into opening the door immediately.</a>
+</body></html>
+

+ 8 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32364-4.htm

@@ -0,0 +1,8 @@
+<html><head>
+<body>
+Hellbound Traitor:<br>
+Ha? My, my -- you are an eager young pup, aren't you? But what would happen if I called out to my comrades that foreign mercenaries were here to attack us? 
+They would flood out and overpower you in an instant!<br>
+<a action="bypass -h npc_%objectId%_Chat 3">Ask what he wants in return for opening the door.</a>
+</body></html>
+

+ 8 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32364.htm

@@ -0,0 +1,8 @@
+<html><head>
+<body>
+Hellbound Traitor:<br>
+Fools! They are wasting their time and effort on a lost cause...<br>
+<a action="bypass -h npc_%objectId%_Chat 1">Ask him who is foolish.</a><br>
+<a action="bypass -h npc_%objectId%_Quest">Quest.</a>
+</body></html>
+

+ 9 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32373.htm

@@ -0,0 +1,9 @@
+<html><head>
+<body>
+Dorian:<br>
+Welcome! I have waited for you for so long... I must tell you that there is a strong magical barrier surrounding Steel Citadel. 
+If any non-devil attempts to enter the tower, the barrier will activate, breaking everything in its field into pieces. 
+Fortunately, I know how to circumvent that magic. Do you wish my help?<br>
+<a action="bypass -h Quest TullyWorkshop enter">Get help.</a><br>
+<a action="bypass -h npc_%objectId%_Quest">Quest.</a>
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32374.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Teleportation Cubic:<br>
+<a action="bypass -h npc_%objectId%_Quest RankuFloor">Go to the next area.</a>
+</body></html>
+

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32375.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Teleportation Cubic:<br>
+<a action="bypass -h npc_%objectId%_Quest DemonPrinceFloor">Would you like to move to the other area?</a>
+</body></html>
+

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32376.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Teleport Cube:<br>
+The device seems to be able to physically transport people to a different dimension, to the place where Beleth sleeps.<br>
+<a action="bypass -h npc_%objectId%_Quest SteelCitadelTeleport">Meet Beleth.</a>
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32745.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32746.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32747.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstairs.</a>
+</body></html>

+ 8 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32748.htm

@@ -0,0 +1,8 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstairs.</a><br>
+<a action="bypass -h npc_%objectId%_Quest DemonPrinceFloor">Face Demon Prince.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32749.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32750.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32751.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Go upstairs.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstairs.</a>
+</body></html>

+ 8 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32752.htm

@@ -0,0 +1,8 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TowerOfInfinitum up">Come out from Tower of Space.</a><br>
+<a action="bypass -h Quest TowerOfInfinitum down">Go downstaris.</a><br>
+<a action="bypass -h npc_%objectId%_Quest RankuFloor">Face Demon Prince.</a>
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32753.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TullyWorkshop up">Go upstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32754.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TullyWorkshop up">Go upstairs.</a><br>
+<a action="bypass -h Quest TullyWorkshop down">Go downstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32755.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TullyWorkshop up">Go upstairs.</a><br>
+<a action="bypass -h Quest TullyWorkshop down">Go downstairs.</a>
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/html/default/32756.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Teleport Device:<br>
+It's a teleporter where one can travel around space.<br>
+<a action="bypass -h Quest TullyWorkshop up">Go upstairs.</a><br>
+<a action="bypass -h Quest TullyWorkshop down">Go downstairs.</a>
+</body></html>

+ 11 - 0
L2J_DataPack_BETA/dist/game/data/html/merchant/32347-1.htm

@@ -0,0 +1,11 @@
+<html><head>
+<body>
+Shhadai:<br>
+The Ancient Text of the Demon is an old tome regarded as an unholy scripture by the Demons of Hellbound. It was created through the power of darkness and 
+contains a mysterious energy, which can be very useful -- if you can obtain it, of course.<br>
+You can find the Hidden First Page, the Hidden Second Page 
+and the Fragment of a Contract with the Demon by reading this book. However, it will turn to dust if you try to use physical strength on it, 
+so you must be careful.<br>
+If you bring it to me, I can put it to good use -- it will be utterly useless to you, in case you had other ideas. But give it to me and I will exchange it 
+for an item of greater value for you.<br>
+</body></html>

+ 4 - 1
L2J_DataPack_BETA/dist/game/data/html/merchant/32347.htm

@@ -1,5 +1,8 @@
 <html><body>Shadai:<br>
-Greetings, traveler! I am Shadai of Hellbound, the legendary Dwarven blacksmith. Ah, I know I may look a bit shabby, but you mustn't judge a sword by its sheath! Ha ha ha! You are a lucky fellow, my friend, to have bumped into me. Interested in turning that luck into wealth? I'll make you a deal: if you get me an item I need, I'll use my skills to craft you something.<br>
+Greetings, traveler! I am Shadai of Hellbound, the legendary Dwarven blacksmith. Ah, I know I may look a bit shabby, but you mustn't judge a sword by its 
+sheath! Ha ha ha! You are a lucky fellow, my friend, to have bumped into me. Interested in turning that luck into wealth? I'll make you a deal: 
+if you get me an item I need, I'll use my skills to craft you something.<br>
+<a action="bypass -h npc_%objectId%_Chat 1">Ask about Ancient Text of the Demon.</a><br>
 <a action="bypass -h npc_%objectId%_multisell 323470001">Process the cursed Seal Stones.</a><br>
 <a action="bypass -h npc_%objectId%_multisell 323470002">Exchange a shoulder ornament to enhance the power of armor.</a><br>
 <a action="bypass -h npc_%objectId%_exc_multisell 323470003">Enhance power of armor.</a><br>

+ 10 - 0
L2J_DataPack_BETA/dist/game/data/instances/DemonPrince.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<instance name="Demon Prince">
+	<activityTime val="30" />
+	<allowSummon val="false" />
+	<emptyDestroyTime val="600" />
+	<spawnpoint spawnX="-22213" spawnY="277138" spawnZ="-9930" />
+	<spawnlist>
+		<spawn npcId="25540" x="-22199" y="278407" z="-8264" heading="0" respawn="0" amount="1" />
+	</spawnlist>
+</instance>

+ 63 - 0
L2J_DataPack_BETA/dist/game/data/instances/HellboundTown.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<instance name="HellboundTown" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="instance.xsd">
+	<activityTime val="30" />
+	<allowSummon val="false" />
+	<emptyDestroyTime val="180" />
+	<spawnPoint spawnX="13725" spawnY="255403" spawnZ="-2023" />
+	<spawnlist>
+		<spawn npcId="32343" x="19604" y="250067" z="-2022" heading="16384" respawn="60" /> <!-- Moonlight Tombstone -->
+		<spawn npcId="32358" x="14127" y="250622" z="-1940" heading="0" respawn="0" /> <!-- Native Prisoner -->
+		<spawn npcId="32358" x="15724" y="252362" z="-2015" heading="0" respawn="0" /> <!-- Native Prisoner -->
+		<spawn npcId="32358" x="19927" y="256340" z="-2090" heading="0" respawn="0" /> <!-- Native Prisoner -->
+		<spawn npcId="32358" x="21998" y="254210" z="-2014" heading="0" respawn="0" /> <!-- Native Prisoner -->
+		<spawn npcId="32358" x="17238" y="252901" z="-2015" heading="0" respawn="0" /> <!-- Native Prisoner -->
+		<spawn npcId="22359" x="19713" y="253994" z="-2030" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20671" y="252761" z="-2015" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20317" y="253829" z="-2030" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18928" y="253367" z="-2030" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="21059" y="252988" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20444" y="254130" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18042" y="253607" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20727" y="252722" z="-2019" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18552" y="252839" z="-2035" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20775" y="252957" z="-2013" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18310" y="252436" z="-2025" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20164" y="254332" z="-2015" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="19202" y="253217" z="-2025" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="21353" y="253200" z="-2025" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18625" y="252792" z="-2033" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="16091" y="255184" z="-2060" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="16310" y="255157" z="-2080" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="15960" y="254648" z="-2066" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="16150" y="254762" z="-2080" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="16052" y="255063" z="-2060" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20046" y="250616" z="-2016" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20089" y="250776" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="19804" y="250856" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20106" y="250574" z="-2010" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="20070" y="250414" z="-2006" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="19008" y="256250" z="-2100" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18882" y="256236" z="-2098" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18867" y="256040" z="-2080" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="18854" y="256358" z="-2100" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="19141" y="256018" z="-2100" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="15556" y="250954" z="-1960" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="15657" y="251717" z="-2000" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="15338" y="250997" z="-1960" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="14811" y="251421" z="-1987" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="15462" y="251478" z="-1980" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="14127" y="253927" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="14444" y="253998" z="-2034" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="14422" y="253606" z="-2025" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="14119" y="253493" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22359" x="14436" y="253491" z="-2020" heading="0" respawn="0" /> <!-- Town Guard -->
+		<spawn npcId="22360" x="14840" y="251949" z="-2009" heading="17616" respawn="0" /> <!-- Town Patrolman -->
+		<spawn npcId="22360" x="16082" y="251790" z="-2000" heading="11536" respawn="0" /> <!-- Town Patrolman -->
+		<spawn npcId="22360" x="16524" y="255244" z="-2080" heading="10664" respawn="0" /> <!-- Town Patrolman -->
+		<spawn npcId="22360" x="17670" y="252256" z="-2022" heading="19040" respawn="0" /> <!-- Town Patrolman -->
+		<spawn npcId="22361" x="14091" y="250533" z="-1940" heading="0" respawn="0" /> <!-- Steel Citadel Keymaster -->
+
+		<!-- Due to AI needs better to spawn Amaskari by script -->
+		<!-- <spawn npcId="22449" x="19424" y="253360" z="-2032" heading="16860" respawn="0" /> --> <!-- Amaskari -->
+	</spawnlist>
+</instance>

+ 10 - 0
L2J_DataPack_BETA/dist/game/data/instances/Ranku.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<instance name="Ranku">
+	<activityTime val="30" />
+	<allowSummon val="false" />
+	<emptyDestroyTime val="600" />
+	<spawnpoint spawnX="-19006" spawnY="277065" spawnZ="-13383" />
+	<spawnlist>
+		<spawn npcId="25542" x="-19056" y="278732" z="-15000" heading="0" respawn="0" amount="1" />
+	</spawnlist>
+</instance>

+ 8 - 0
L2J_DataPack_BETA/dist/game/data/multisell/322980001.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Hude 1 -->
+<list xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance" ns0:noNamespaceSchemaLocation="multisell.xsd">
+	<item>
+		<ingredient count="25000" id="57" />
+		<production count="1" id="9702" />
+	</item>
+</list>

+ 624 - 0
L2J_DataPack_BETA/dist/game/data/multisell/322980002.xml

@@ -0,0 +1,624 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Hude S80 Rec and Parts -->
+<list xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance" ns0:noNamespaceSchemaLocation="multisell.xsd">
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Sword Piece -->
+		<production count="1" id="9616" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Blade Piece -->
+		<production count="1" id="9617" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Phantom Piece -->
+		<production count="1" id="9618" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Bow Piece -->
+		<production count="1" id="9619" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Knife Piece -->
+		<production count="1" id="9620" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Halberd Piece -->
+		<production count="1" id="9621" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Cudgel Piece -->
+		<production count="1" id="9622" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Crusher Fragment -->
+		<production count="1" id="10547" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Mace Piece -->
+		<production count="1" id="9623" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Staff Fragment -->
+		<production count="1" id="10546" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="68" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="168" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Dynasty Bagh-Nakh Piece -->
+		<production count="1" id="9624" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Sword (60%) -->
+		<production count="1" id="9967" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Blade (60%) -->
+		<production count="1" id="9968" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Phantom (60%) -->
+		<production count="1" id="9969" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Bow (60%) -->
+		<production count="1" id="9970" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Knife (60%) -->
+		<production count="1" id="9971" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Halberd (60%) -->
+		<production count="1" id="9972" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Cudgel (60%) -->
+		<production count="1" id="9973" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Mace (60%) -->
+		<production count="1" id="9974" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Bagh-Nakh (60%) -->
+		<production count="1" id="9975" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Crusher(60%) -->
+		<production count="1" id="10545" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="612" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="1530" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="153" id="9602" />
+		<!-- Recipe - Dynasty Staff(60%) -->
+		<production count="1" id="10544" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="41" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="104" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="10" id="9602" />
+		<!-- Sealed Dynasty Breast Plate Piece -->
+		<production count="1" id="9530" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="28" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="72" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="7" id="9602" />
+		<!-- Sealed Dynasty Gaiters Piece -->
+		<production count="1" id="9531" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="16" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="42" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="5" id="9602" />
+		<!-- Sealed Dynasty Helmet Piece -->
+		<production count="1" id="9532" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="13" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Gauntlet Piece -->
+		<production count="1" id="9533" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="13" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Boot Piece -->
+		<production count="1" id="9534" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="32" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="78" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="8" id="9602" />
+		<!-- Sealed Dynasty Leather Armor Piece -->
+		<production count="1" id="9535" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="22" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="53" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="6" id="9602" />
+		<!-- Sealed Dynasty Leather Leggings Piece -->
+		<production count="1" id="9536" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="18" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="43" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Leather Helmet Piece -->
+		<production count="1" id="9537" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="13" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Leather Glove Piece -->
+		<production count="1" id="9538" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="13" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Leather Boots Piece -->
+		<production count="1" id="9539" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="32" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="78" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="8" id="9602" />
+		<!-- Sealed Dynasty Tunic Piece -->
+		<production count="1" id="9540" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="22" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="53" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="6" id="9602" />
+		<!-- Sealed Dynasty Stocking Piece -->
+		<production count="1" id="9541" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="16" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="42" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="5" id="9602" />
+		<!-- Sealed Dynasty Circlet Piece -->
+		<production count="1" id="9542" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="12" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Glove Piece -->
+		<production count="1" id="9543" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="12" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Shoes Piece -->
+		<production count="1" id="9544" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="12" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Shield Piece -->
+		<production count="1" id="9545" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="12" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="30" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Battleground Spell - Wizard -->
+		<production count="1" id="10114" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="12" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="35" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="4" id="9602" />
+		<!-- Sealed Dynasty Earring Gemstone -->
+		<production count="1" id="9991" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="17" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="42" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="5" id="9602" />
+		<!-- Sealed Dynasty Necklace Gemstone -->
+		<production count="1" id="9992" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="10" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="25" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="2" id="9602" />
+		<!-- Sealed Dynasty Ring Gemstone -->
+		<production count="1" id="9993" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="266" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="661" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="67" id="9602" />
+		<!-- Recipe: Sealed Dynasty Breast Plate (60%) -->
+		<production count="1" id="9482" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="166" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="413" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="42" id="9602" />
+		<!-- Recipe: Sealed Dynasty Gaiters (60%) -->
+		<production count="1" id="9483" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="100" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="248" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="25" id="9602" />
+		<!-- Recipe: Sealed Dynasty Helmet (60%) -->
+		<production count="1" id="9484" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="66" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="164" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Gauntlet (60%) -->
+		<production count="1" id="9485" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="66" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="164" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Boots (60%) -->
+		<production count="1" id="9486" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="200" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="448" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="50" id="9602" />
+		<!-- Recipe: Sealed Dynasty Leather Armor (60%) -->
+		<production count="1" id="9487" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="125" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="314" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="31" id="9602" />
+		<!-- Recipe: Sealed Dynasty Leather Leggings (60%) -->
+		<production count="1" id="9488" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="100" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="249" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="25" id="9602" />
+		<!-- Recipe: Sealed Dynasty Leather Helmet (60%) -->
+		<production count="1" id="9489" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="66" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="164" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Leather Gloves (60%) -->
+		<production count="1" id="9490" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="66" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="164" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Leather Boots (60%) -->
+		<production count="1" id="9491" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="200" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="498" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="50" id="9602" />
+		<!-- Recipe: Sealed Dynasty Tunic (60%) -->
+		<production count="1" id="9492" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="125" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="313" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="31" id="9602" />
+		<!-- Recipe: Sealed Dynasty Stockings (60%) -->
+		<production count="1" id="9493" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="100" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="249" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="25" id="9602" />
+		<!-- Recipe: Sealed Dynasty Circlet (60%) -->
+		<production count="1" id="9494" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="67" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="161" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Gloves (60%) -->
+		<production count="1" id="9495" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="67" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="161" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Shoes (60%) -->
+		<production count="1" id="9496" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="70" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="179" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Shield (60%) -->
+		<production count="1" id="9497" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="70" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="179" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="17" id="9602" />
+		<!-- Recipe: Sealed Dynasty Sigil (60%) -->
+		<production count="1" id="10115" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="66" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="162" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="16" id="9602" />
+		<!-- Recipe - Sealed Dynasty Earrings (70%) -->
+		<production count="1" id="9985" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="88" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="220" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="21" id="9602" />
+		<!-- Recipe - Sealed Dynasty Necklace (70%) -->
+		<production count="1" id="9486" />
+	</item>
+	<item>
+		<!-- Hidden First Page -->
+		<ingredient count="42" id="9600" />
+		<!-- Hidden Second Page -->
+		<ingredient count="110" id="9601" />
+		<!-- Demon Contract Fragment -->
+		<ingredient count="11" id="9602" />
+		<!-- Recipe - Sealed Dynasty Ring (70%) -->
+		<production count="1" id="9987" />
+	</item>
+</list>

+ 6 - 6
L2J_DataPack_BETA/dist/game/data/multisell/323470001.xml

@@ -3,24 +3,24 @@
 	<item>
 		<!-- Cursed Red Soul Crystal - Stage 14 -->
 		<ingredient count="1" id="10160" />
-		<!-- Gemstone S -->
-		<ingredient count="1150" id="2134" />
+		<!-- Adena -->
+		<ingredient count="30000000" id="57" />
 		<!-- Red Soul Crystal - Stage 14 -->
 		<production count="1" id="9570" />
 	</item>
 	<item>
 		<!-- Cursed Green Soul Crystal - Stage 14 -->
 		<ingredient count="1" id="10162" />
-		<!-- Gemstone S -->
-		<ingredient count="1150" id="2134" />
+		<!-- Adena -->
+		<ingredient count="30000000" id="57" />
 		<!-- Green Soul Crystal - Stage 14 -->
 		<production count="1" id="9572" />
 	</item>
 	<item>
 		<!-- Cursed Blue Soul Crystal - Stage 14 -->
 		<ingredient count="1" id="10161" />
-		<!-- Gemstone S -->
-		<ingredient count="1150" id="2134" />
+		<!-- Adena -->
+		<ingredient count="30000000" id="57" />
 		<!-- Blue Soul Crystal - Stage 14 -->
 		<production count="1" id="9571" />
 	</item>

+ 8 - 8
L2J_DataPack_BETA/dist/game/data/multisell/323470002.xml

@@ -11,16 +11,16 @@
 		<ingredient count="259" id="9599" />
 		<!-- Adena -->
 		<ingredient count="12000000" id="57" />
-		<!-- Forgotten Scroll - Expose Weak Point -->
-		<production count="1" id="10560" />
+		<!-- Forgotten Scroll - Sixth Sense -->
+		<production count="1" id="10559" />
 	</item>
 	<item>
 		<!-- Ancient Tome of the Demon -->
 		<ingredient count="259" id="9599" />
 		<!-- Adena -->
 		<ingredient count="12000000" id="57" />
-		<!-- Forgotten Scroll - Sixth Sense -->
-		<production count="1" id="10559" />
+		<!-- Forgotten Scroll - Expose Weak Point -->
+		<production count="1" id="10560" />
 	</item>
 	<item>
 		<!-- Ancient Tome of the Demon -->
@@ -35,16 +35,16 @@
 		<ingredient count="259" id="9599" />
 		<!-- Adena -->
 		<ingredient count="12000000" id="57" />
-		<!-- Forgotten Scroll - Seven Arrow -->
-		<production count="1" id="14211" />
+		<!-- Forgotten Scroll - Silent Mind -->
+		<production count="1" id="14220" />
 	</item>
 	<item>
 		<!-- Ancient Tome of the Demon -->
 		<ingredient count="259" id="9599" />
 		<!-- Adena -->
 		<ingredient count="12000000" id="57" />
-		<!-- Forgotten Scroll - Silent Mind -->
-		<production count="1" id="14220" />
+		<!-- Forgotten Scroll - Seven Arrow -->
+		<production count="1" id="14211" />
 	</item>
 	<item>
 		<!-- Ancient Tome of the Demon -->

+ 42 - 0
L2J_DataPack_BETA/dist/game/data/scripts.cfg

@@ -16,6 +16,7 @@ ai/fantasy_isle/HandysBlockCheckerEvent.java
 ai/group_template/L2AttackableAIScript.java
 ai/group_template/BeastFarm.java
 ai/group_template/Chests.java
+ai/group_template/Chimeras.java
 ai/group_template/DenOfEvil.java
 ai/group_template/EnergySeeds.java
 ai/group_template/EvasGiftBoxes.java
@@ -28,24 +29,39 @@ ai/group_template/PlainsOfLizardman.java
 ai/group_template/PolymorphingAngel.java
 ai/group_template/PolymorphingOnAttack.java
 ai/group_template/PrisonGuards.java
+ai/group_template/RandomSpawn.java
+ai/group_template/Remnants.java
+ai/group_template/Sandstorms.java
 ai/group_template/SearchingMaster.java
 ai/group_template/SeedOfAnnihilation.java
 ai/group_template/SeeThroughSilentMove.java
+ai/group_template/Slaves.java
 ai/group_template/StakatoNest.java
 ai/group_template/StarStones.java
 ai/group_template/SummonMinions.java
 
+ai/individual/Amaskari.java
 ai/individual/Antharas.java
 ai/individual/Baium.java
+ai/individual/Beleth.java
 ai/individual/Core.java
 ai/individual/DarkWaterDragon.java
+ai/individual/DemonPrince.java
 ai/individual/DrChaos.java
+ai/individual/Epidos.java
 ai/individual/FleeNpc.java
 ai/individual/GeneralDilios.java
 ai/individual/Gordon.java
+ai/individual/HellboundCore.java
 ai/individual/IceFairySirra.java
+ai/individual/Keltas.java
+ai/individual/NaiaLock.java
 ai/individual/Orfen.java
+ai/individual/OutpostCaptain.java
 ai/individual/QueenAnt.java
+ai/individual/Ranku.java
+ai/individual/SinWardens.java
+ai/individual/Typhoon.java
 ai/individual/Valakas.java
 ai/individual/Zaken.java
 ai/individual/Frintezza.java
@@ -173,6 +189,7 @@ teleports/NoblesseTeleport/NoblesseTeleport.java
 teleports/OracleTeleport/OracleTeleport.java
 teleports/PaganTeleporters/PaganTeleporters.java
 teleports/StakatoNest/StakatoNest.java
+teleports/SteelCitadelTeleport/SteelCitadelTeleport.java
 teleports/StrongholdsTeleports/StrongholdsTeleports.java
 teleports/Survivor/Survivor.java
 teleports/TeleportToFantasy/TeleportToFantasy.java
@@ -203,15 +220,36 @@ village_master/FirstClassTransferTalk/FirstClassTransferTalk.java
 # Instance Dungeons Section
 instances/DarkCloudMansion/DarkCloudMansion.java
 instances/CrystalCaverns/CrystalCaverns.java
+instances/DemonPrinceFloor/DemonPrinceFloor.java
+instances/HellboundTown/HellboundTown.java 
 instances/Kamaloka/Kamaloka.java
 instances/Pailaka/PailakaSongOfIceAndFire.java
 instances/Pailaka/PailakaDevilsLegacy.java
+instances/RankuFloor/RankuFloor.java
 instances/SeedOfInfinity/HallOfSuffering.java
 instances/SeedOfDestruction/Stage1.java
 instances/NornilsGarden/NornilsGarden.java
 
 # Hellbound Section
+hellbound/Engine.java
+hellbound/AnomicFoundry/AnomicFoundry.java
+hellbound/BaseTower/BaseTower.java
+hellbound/Bernarde/Bernarde.java
 hellbound/Budenka/Budenka.java
+hellbound/Buron/Buron.java
+hellbound/Deltuva/Deltuva.java
+hellbound/Falk/Falk.java
+hellbound/Hude/Hude.java
+hellbound/Jude/Jude.java
+hellbound/Kanaf/Kanaf.java
+hellbound/Kief/Kief.java
+hellbound/Natives/Natives.java
+hellbound/Quarry/Quarry.java
+hellbound/Shadai/Shadai.java  
+hellbound/Solomon/Solomon.java
+hellbound/TowerOfInfinitum/TowerOfInfinitum.java
+hellbound/TowerOfNaia/TowerOfNaia.java
+hellbound/TullyWorkshop/TullyWorkshop.java
 
 # Quests Section
 quests/SagasScripts/SagasSuperClass.java
@@ -301,6 +339,7 @@ quests/124_MeetingTheElroki/__init__.py
 quests/125_TheNameOfEvil1/__init__.py
 quests/130_PathToHellbound/__init__.py
 quests/131_BirdInACage/__init__.py
+quests/Q132_MatrasCuriosity/Q132_MatrasCuriosity.java
 quests/133_ThatsBloodyHot/__init__.py
 quests/134_TempleMissionary/__init__.py
 quests/135_TempleExecutor/__init__.py
@@ -418,6 +457,7 @@ quests/275_BlackWingedSpies/__init__.py
 quests/276_HestuiTotem/__init__.py
 quests/277_GatekeepersOffering/__init__.py
 quests/Q278_HomeSecurity/Q278_HomeSecurity.java
+quests/Q279_TargetOfOpportunity/Q279_TargetOfOpportunity.java
 quests/280_TheFoodChain/__init__.py
 quests/281_HeadForTheHills/__init__.py
 quests/283_TheFewTheProudTheBrave/__init__.py
@@ -599,6 +639,8 @@ quests/661_TheHarvestGroundsSafe/__init__.py
 quests/662_AGameOfCards/__init__.py
 quests/663_SeductiveWhispers/__init__.py
 quests/688_DefeatTheElrokianRaiders/__init__.py
+quests/Q690_JudeRequest/Q690_JudeRequest.java
+quests/Q691_MatrasSuspiciousRequest/Q691_MatrasSuspiciousRequest.java
 quests/Q692_HowtoOpposeEvil/Q692_HowtoOpposeEvil.java
 quests/699_GuardianOfTheSkies/__init__.py
 quests/700_CursedLife/__init__.py

+ 147 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Chimeras.java

@@ -0,0 +1,147 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.group_template;
+
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author DS
+ */
+public class Chimeras extends L2AttackableAIScript
+{
+	// NPCs
+	private static final int[] NPCS =
+	{
+		22349, 22350, 22351, 22352
+	};
+	private static final int CELTUS = 22353;
+	// Locations
+	private static final int[][] LOCATIONS =
+	{
+		{
+			3678, 233418, -3319
+		},
+		{
+			2038, 237125, -3363
+		},
+		{
+			7222, 240617, -2033
+		},
+		{
+			9969, 235570, -1993
+		}
+	};
+	// Items
+	private static final int BOTTLE = 2359;
+	private static final int DIM_LIFE_FORCE = 9680;
+	private static final int LIFE_FORCE = 9681;
+	private static final int CONTAINED_LIFE_FORCE = 9682;
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if ((HellboundManager.getInstance().getLevel() == 7) && !npc.isTeleporting()) // Have random spawn points only in 7 lvl
+		{
+			final int[] spawn = LOCATIONS[Rnd.get(LOCATIONS.length)];
+			if (!npc.isInsideRadius(spawn[0], spawn[1], spawn[2], 200, false, false))
+			{
+				npc.getSpawn().setLocx(spawn[0]);
+				npc.getSpawn().setLocy(spawn[1]);
+				npc.getSpawn().setLocz(spawn[2]);
+				ThreadPoolManager.getInstance().scheduleGeneral(new Teleport(npc, spawn), 100);
+			}
+		}
+		return super.onSpawn(npc);
+	}
+	
+	@Override
+	public final String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
+	{
+		if ((skill.getId() == BOTTLE) && !npc.isDead())
+		{
+			if ((targets.length > 0) && (targets[0] == npc))
+			{
+				if (npc.getCurrentHp() < (npc.getMaxHp() * 0.1))
+				{
+					if (HellboundManager.getInstance().getLevel() == 7)
+					{
+						HellboundManager.getInstance().updateTrust(3, true);
+					}
+					
+					npc.setIsDead(true);
+					if (npc.getNpcId() == CELTUS)
+					{
+						((L2Attackable) npc).dropItem(caster, CONTAINED_LIFE_FORCE, 1);
+					}
+					else
+					{
+						if (Rnd.get(100) < 80)
+						{
+							((L2Attackable) npc).dropItem(caster, DIM_LIFE_FORCE, 1);
+						}
+						else if (Rnd.get(100) < 80)
+						{
+							((L2Attackable) npc).dropItem(caster, LIFE_FORCE, 1);
+						}
+					}
+					npc.onDecay();
+				}
+			}
+		}
+		return super.onSkillSee(npc, caster, skill, targets, isPet);
+	}
+	
+	private static class Teleport implements Runnable
+	{
+		private final L2Npc _npc;
+		private final int[] _coords;
+		
+		public Teleport(L2Npc npc, int[] coords)
+		{
+			_npc = npc;
+			_coords = coords;
+		}
+		
+		@Override
+		public void run()
+		{
+			_npc.teleToLocation(_coords[0], _coords[1], _coords[2]);
+		}
+	}
+	
+	public Chimeras(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		for (int npcId : NPCS)
+		{
+			addSkillSeeId(npcId);
+		}
+		
+		addSpawnId(CELTUS);
+		addSkillSeeId(CELTUS);
+	}
+	
+	public static void main(String[] args)
+	{
+		new Chimeras(-1, "Chimeras", "ai");
+	}
+}

+ 5 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/L2AttackableAIScript.java

@@ -16,6 +16,7 @@ package ai.group_template;
 
 import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK;
 
+import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlEvent;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.NpcTable;
@@ -206,7 +207,10 @@ public class L2AttackableAIScript extends QuestJython
 		{
 			final L2MonsterInstance mob = (L2MonsterInstance)npc;
 			if (mob.getLeader() != null)
-				mob.getLeader().getMinionList().onMinionDie(mob, -1);
+			{
+				final int respawnTime = Config.MINIONS_RESPAWN_TIME.get(mob.getNpcId()) > 0 ? Config.MINIONS_RESPAWN_TIME.get(mob.getNpcId()) * 1000 : -1;
+				mob.getLeader().getMinionList().onMinionDie(mob, respawnTime);
+			}
 
 			if (mob.hasMinions())
 				mob.getMinionList().onMasterDie(false);

+ 179 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/RandomSpawn.java

@@ -0,0 +1,179 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.group_template;
+
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.util.Rnd;
+
+/**
+ * This class manages the spawn of NPC's, having several random spawn points.
+ * @author GKR
+ */
+public class RandomSpawn extends L2AttackableAIScript
+{
+	private static final Map<Integer, int[][]> SPAWN_POINTS = new FastMap<Integer, int[][]>();
+	
+	static
+	{
+		// Keltas
+		SPAWN_POINTS.put(22341, new int[][]
+		{
+			{
+				-27136, 250938, -3523
+			},
+			{
+				-29658, 252897, -3523
+			},
+			{
+				-27237, 251943, -3527
+			},
+			{
+				-28868, 250113, -3479
+			}
+		});
+		// Keymaster
+		SPAWN_POINTS.put(22361, new int[][]
+		{
+			{
+				14091, 250533, -1940
+			},
+			{
+				15762, 252440, -2015
+			},
+			{
+				19836, 256212, -2090
+			},
+			{
+				21940, 254107, -2010
+			},
+			{
+				17299, 252943, -2015
+			}
+		});
+		// Typhoon
+		SPAWN_POINTS.put(25539, new int[][]
+		{
+			{
+				-20641, 255370, -3235
+			},
+			{
+				-16157, 250993, -3058
+			},
+			{
+				-18269, 250721, -3151
+			},
+			{
+				-16532, 254864, -3223
+			},
+			{
+				-19055, 253489, -3440
+			},
+			{
+				-9684, 254256, -3148
+			},
+			{
+				-6209, 251924, -3189
+			},
+			{
+				-10547, 251359, -2929
+			},
+			{
+				-7254, 254997, -3261
+			},
+			{
+				-4883, 253171, -3322
+			}
+		});
+		// Mutated Elpy
+		SPAWN_POINTS.put(25604, new int[][]
+		{
+			{
+				-46080, 246368, -14183
+			},
+			{
+				-44816, 246368, -14183
+			},
+			{
+				-44224, 247440, -14184
+			},
+			{
+				-44896, 248464, -14183
+			},
+			{
+				-46064, 248544, -14183
+			},
+			{
+				-46720, 247424, -14183
+			}
+		});
+	}
+	
+	public RandomSpawn(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		
+		for (int npcId : SPAWN_POINTS.keySet())
+		{
+			addSpawnId(npcId);
+		}
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if (!npc.isTeleporting())
+		{
+			final int[][] spawnlist = SPAWN_POINTS.get(npc.getNpcId());
+			final int[] spawn = spawnlist[Rnd.get(spawnlist.length)];
+			if (!npc.isInsideRadius(spawn[0], spawn[1], spawn[2], 200, false, false))
+			{
+				npc.getSpawn().setLocx(spawn[0]);
+				npc.getSpawn().setLocy(spawn[1]);
+				npc.getSpawn().setLocz(spawn[2]);
+				ThreadPoolManager.getInstance().scheduleGeneral(new Teleport(npc, spawn), 100);
+			}
+		}
+		
+		return super.onSpawn(npc);
+	}
+	
+	private static class Teleport implements Runnable
+	{
+		private final L2Npc _npc;
+		private final int[] _coords;
+		
+		public Teleport(L2Npc npc, int[] coords)
+		{
+			_npc = npc;
+			_coords = coords;
+		}
+		
+		@Override
+		public void run()
+		{
+			_npc.teleToLocation(_coords[0], _coords[1], _coords[2]);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new RandomSpawn(-1, "RandomSpawn", "ai");
+	}
+}

+ 91 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Remnants.java

@@ -0,0 +1,91 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.group_template;
+
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author DS
+ */
+public class Remnants extends L2AttackableAIScript
+{
+	private static final int[] NPCS =
+	{
+		18463, 18464, 18465
+	};
+	
+	private static final int HOLY_WATER = 2358;
+	
+	// TODO: Find retail strings.
+	// private static final String MSG = "The holy water affects Remnants Ghost. You have freed his soul.";
+	// private static final String MSG_DEREK = "The holy water affects Derek. You have freed his soul.";
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		npc.setIsMortal(false);
+		return super.onSpawn(npc);
+	}
+	
+	@Override
+	public final String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
+	{
+		if (skill.getId() == HOLY_WATER)
+		{
+			if (!npc.isDead())
+			{
+				if ((targets.length > 0) && (targets[0] == npc))
+				{
+					if (npc.getCurrentHp() < (npc.getMaxHp() * 0.02)) // Lower, than 2%
+					{
+						npc.doDie(caster);
+						//@formatter:off
+						/*if (npc.getNpcId() == DEREK)
+						{
+							caster.sendMessage(MSG_DEREK);
+						}
+						else
+						{
+							caster.sendMessage(MSG);
+						}*/
+						//@formatter:on
+					}
+				}
+			}
+		}
+		
+		return super.onSkillSee(npc, caster, skill, targets, isPet);
+	}
+	
+	// Do not override onKill for Derek here. Let's make global Hellbound manipulations in Engine where it is possible.
+	
+	public Remnants(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		for (int npcId : NPCS)
+		{
+			addSpawnId(npcId);
+			addSkillSeeId(npcId);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new Remnants(-1, Remnants.class.getSimpleName(), "ai");
+	}
+}

+ 49 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Sandstorms.java

@@ -0,0 +1,49 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.group_template;
+
+import com.l2jserver.gameserver.datatables.SkillTable;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author Ectis
+ */
+public class Sandstorms extends L2AttackableAIScript
+{
+	private static final int SANDSTORM = 32350;
+	
+	@Override
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
+	{
+		if (npc.getNpcId() == SANDSTORM)
+		{
+			npc.setTarget(player);
+			npc.doCast(SkillTable.getInstance().getInfo(5435, 1));
+		}
+		return super.onAggroRangeEnter(npc, player, isPet);
+	}
+	
+	public Sandstorms(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		addAttackId(SANDSTORM);
+	}
+	
+	public static void main(String[] args)
+	{
+		new Sandstorms(-1, "Sandstorms", "ai");
+	}
+}

+ 99 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/Slaves.java

@@ -0,0 +1,99 @@
+/*
+ * This program 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.
+ *
+ * This program 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.group_template;
+
+import java.util.List;
+
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.L2CharPosition;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+import com.l2jserver.gameserver.taskmanager.DecayTaskManager;
+
+/**
+ * @author DS
+ */
+public class Slaves extends L2AttackableAIScript
+{
+	private static final int[] MASTERS =
+	{
+		22320, 22321
+	};
+	private static final L2CharPosition MOVE_TO = new L2CharPosition(-25451, 252291, -3252, 3500);
+	private static final int TRUST_REWARD = 10;
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		((L2MonsterInstance) npc).enableMinions(HellboundManager.getInstance().getLevel() < 5);
+		((L2MonsterInstance) npc).setOnKillDelay(1000);
+		
+		return super.onSpawn(npc);
+	}
+	
+	// Let's count trust points for killing in Engine
+	@Override
+	public final String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (((L2MonsterInstance) npc).getMinionList() != null)
+		{
+			final List<L2MonsterInstance> slaves = ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions();
+			if ((slaves != null) && !slaves.isEmpty())
+			{
+				for (L2MonsterInstance slave : slaves)
+				{
+					if ((slave == null) || slave.isDead())
+					{
+						continue;
+					}
+					
+					slave.clearAggroList();
+					slave.abortAttack();
+					slave.abortCast();
+					slave.broadcastPacket(new NpcSay(slave.getObjectId(), Say2.ALL, slave.getNpcId(), NpcStringId.THANK_YOU_FOR_SAVING_ME_FROM_THE_CLUTCHES_OF_EVIL));
+					
+					if ((HellboundManager.getInstance().getLevel() >= 1) && (HellboundManager.getInstance().getLevel() <= 2))
+					{
+						HellboundManager.getInstance().updateTrust(TRUST_REWARD, false);
+					}
+					
+					slave.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, MOVE_TO);
+					DecayTaskManager.getInstance().addDecayTask(slave);
+				}
+			}
+		}
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	public Slaves(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		for (int npcId : MASTERS)
+		{
+			addSpawnId(npcId);
+			addKillId(npcId);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new Slaves(-1, "Slaves", "ai");
+	}
+}

+ 181 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Amaskari.java

@@ -0,0 +1,181 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.L2Effect;
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+import com.l2jserver.gameserver.skills.SkillHolder;
+import com.l2jserver.util.Rnd;
+
+/**
+ * Manages Amaskari's and minions' chat and some skill usage.
+ * @author GKR
+ */
+public class Amaskari extends L2AttackableAIScript
+{
+	private static final int AMASKARI = 22449;
+	private static final int AMASKARI_PRISONER = 22450;
+	
+	private static final int BUFF_ID = 4632;
+	private static SkillHolder[] BUFF =
+	{
+		new SkillHolder(BUFF_ID, 1), new SkillHolder(BUFF_ID, 2), new SkillHolder(BUFF_ID, 3)
+	};
+	// private static SkillHolder INVINCIBILITY = new SkillHolder(5417, 1);
+	
+	private static final NpcStringId[] AMASKARI_NPCSTRING_ID =
+	{
+		NpcStringId.ILL_MAKE_EVERYONE_FEEL_THE_SAME_SUFFERING_AS_ME, NpcStringId.HA_HA_YES_DIE_SLOWLY_WRITHING_IN_PAIN_AND_AGONY, NpcStringId.MORE_NEED_MORE_SEVERE_PAIN, NpcStringId.SOMETHING_IS_BURNING_INSIDE_MY_BODY
+	};
+	
+	private static final NpcStringId[] MINIONS_NPCSTRING_ID =
+	{
+		NpcStringId.AHH_MY_LIFE_IS_BEING_DRAINED_OUT, NpcStringId.THANK_YOU_FOR_SAVING_ME, NpcStringId.IT_WILL_KILL_EVERYONE, NpcStringId.EEEK_I_FEEL_SICKYOW
+	};
+	
+	public Amaskari(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		addKillId(AMASKARI);
+		addKillId(AMASKARI_PRISONER);
+		addAttackId(AMASKARI);
+		addSpawnId(AMASKARI_PRISONER);
+	}
+	
+	@Override
+	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("stop_toggle"))
+		{
+			npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.ALL, npc.getNpcId(), AMASKARI_NPCSTRING_ID[2]));
+			((L2MonsterInstance) npc).clearAggroList();
+			((L2MonsterInstance) npc).getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+			npc.setIsInvul(false);
+			// npc.doCast(INVINCIBILITY.getSkill())
+		}
+		else if (event.equalsIgnoreCase("onspawn_msg") && (npc != null) && !npc.isDead())
+		{
+			if (Rnd.get(100) > 20)
+			{
+				npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.ALL, npc.getNpcId(), MINIONS_NPCSTRING_ID[2]));
+			}
+			else if (Rnd.get(100) > 40)
+			{
+				npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.ALL, npc.getNpcId(), MINIONS_NPCSTRING_ID[3]));
+			}
+			startQuestTimer("onspawn_msg", (Rnd.get(8) + 1) * 30000, npc, null);
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet, L2Skill skill)
+	{
+		if ((npc.getNpcId() == AMASKARI) && (Rnd.get(1000) < 25))
+		{
+			npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.ALL, npc.getNpcId(), AMASKARI_NPCSTRING_ID[0]));
+			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
+			{
+				if ((minion != null) && !minion.isDead() && (Rnd.get(10) == 0))
+				{
+					minion.broadcastPacket(new NpcSay(minion.getObjectId(), Say2.ALL, minion.getNpcId(), MINIONS_NPCSTRING_ID[0]));
+					minion.setCurrentHp(minion.getCurrentHp() - (minion.getCurrentHp() / 5));
+				}
+			}
+		}
+		return super.onAttack(npc, attacker, damage, isPet, skill);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (npc.getNpcId() == AMASKARI_PRISONER)
+		{
+			final L2MonsterInstance master = ((L2MonsterInstance) npc).getLeader();
+			if ((master != null) && !master.isDead())
+			{
+				master.broadcastPacket(new NpcSay(master.getObjectId(), Say2.ALL, master.getNpcId(), AMASKARI_NPCSTRING_ID[1]));
+				final L2Effect e = master.getFirstEffect(BUFF_ID);
+				if ((e != null) && (e.getAbnormalLvl() == 3) && master.isInvul())
+				{
+					master.setCurrentHp(master.getCurrentHp() + (master.getCurrentHp() / 5));
+				}
+				else
+				{
+					master.clearAggroList();
+					master.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+					if (e == null)
+					{
+						master.doCast(BUFF[0].getSkill());
+					}
+					else if (e.getAbnormalLvl() < 3)
+					{
+						master.doCast(BUFF[e.getAbnormalLvl()].getSkill());
+					}
+					else
+					{
+						master.broadcastPacket(new NpcSay(master.getObjectId(), Say2.ALL, master.getNpcId(), AMASKARI_NPCSTRING_ID[3]));
+						// master.doCast(INVINCIBILITY.getSkill())
+						master.setIsInvul(true);
+						startQuestTimer("stop_toggle", 10000, master, null);
+					}
+				}
+			}
+		}
+		else if (npc.getNpcId() == AMASKARI)
+		{
+			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
+			{
+				if ((minion != null) && !minion.isDead())
+				{
+					if (Rnd.get(1000) > 300)
+					{
+						minion.broadcastPacket(new NpcSay(minion.getObjectId(), Say2.ALL, minion.getNpcId(), MINIONS_NPCSTRING_ID[1]));
+					}
+					
+					HellboundManager.getInstance().updateTrust(30, true);
+					minion.deleteMe();
+				}
+			}
+		}
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if (!npc.isTeleporting())
+		{
+			startQuestTimer("onspawn_msg", (Rnd.get(3) + 1) * 30000, npc, null);
+		}
+		return super.onSpawn(npc);
+	}
+	
+	public static void main(String[] args)
+	{
+		new Amaskari(-1, "Amaskari", "ai");
+	}
+}

+ 817 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Beleth.java

@@ -0,0 +1,817 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.ArrayList;
+import java.util.concurrent.ScheduledFuture;
+
+import ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.datatables.DoorTable;
+import com.l2jserver.gameserver.datatables.NpcTable;
+import com.l2jserver.gameserver.datatables.SkillTable;
+import com.l2jserver.gameserver.instancemanager.GrandBossManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.zone.L2ZoneType;
+import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
+import com.l2jserver.gameserver.network.serverpackets.DoorStatusUpdate;
+import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
+import com.l2jserver.gameserver.network.serverpackets.SocialAction;
+import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
+import com.l2jserver.gameserver.network.serverpackets.StaticObject;
+import com.l2jserver.gameserver.templates.StatsSet;
+import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
+import com.l2jserver.gameserver.templates.skills.L2SkillType;
+import com.l2jserver.gameserver.util.Util;
+import com.l2jserver.util.Rnd;
+
+/**
+ * Beleth's AI.
+ * @author Treat
+ */
+public class Beleth extends L2AttackableAIScript
+{
+	private static L2Npc camera;
+	private static L2Npc camera2;
+	private static L2Npc camera3;
+	private static L2Npc camera4;
+	private static L2Npc beleth;
+	private static L2Npc priest;
+	private static L2ZoneType _zone = null;
+	private static L2PcInstance belethKiller;
+	private static boolean debug = false;
+	private static boolean movie = false;
+	private static boolean attacked = false;
+	private static int allowObjectId = 0;
+	private static int killed = 0;
+	private static ScheduledFuture<?> spawnTimer = null;
+	private static ArrayList<L2Npc> minions = new ArrayList<L2Npc>();
+	private static L2Skill Bleed = SkillTable.getInstance().getInfo(5495, 1);
+	private static L2Skill Fireball = SkillTable.getInstance().getInfo(5496, 1);
+	private static L2Skill HornOfRising = SkillTable.getInstance().getInfo(5497, 1);
+	private static L2Skill Lightening = SkillTable.getInstance().getInfo(5499, 1);
+	
+	public Beleth(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		_zone = ZoneManager.getInstance().getZoneById(12018);
+		addEnterZoneId(12018);
+		registerMobs(new int[]
+		{
+			29118, 29119
+		});
+		addStartNpc(32470);
+		addTalkId(32470);
+		addFirstTalkId(29128);
+		StatsSet info = GrandBossManager.getInstance().getStatsSet(29118);
+		int status = GrandBossManager.getInstance().getBossStatus(29118);
+		if (status == 3)
+		{
+			long temp = (info.getLong("respawn_time") - System.currentTimeMillis());
+			if (temp > 0)
+			{
+				ThreadPoolManager.getInstance().scheduleGeneral(new unlock(), temp);
+			}
+			else
+			{
+				GrandBossManager.getInstance().setBossStatus(29118, 0);
+			}
+		}
+		else
+		{
+			GrandBossManager.getInstance().setBossStatus(29118, 0);
+		}
+		DoorTable.getInstance().getDoor(20240001).openMe();
+	}
+	
+	private static L2Npc spawn(int npcId, int[] loc, int instanceId)
+	{
+		try
+		{
+			L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
+			if (template != null)
+			{
+				L2Spawn spawn = new L2Spawn(template);
+				spawn.setInstanceId(instanceId);
+				spawn.setHeading(loc[3]);
+				spawn.setLocx(loc[0]);
+				spawn.setLocy(loc[1]);
+				spawn.setLocz(loc[2] + 20);
+				spawn.setAmount(spawn.getAmount() + 1);
+				return spawn.doSpawn();
+			}
+		}
+		catch (Exception ignored)
+		{
+		}
+		return null;
+	}
+	
+	public static void startSpawnTask()
+	{
+		ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(1), debug ? 10000 : 300000);
+	}
+	
+	private static class unlock implements Runnable
+	{
+		@Override
+		public void run()
+		{
+			GrandBossManager.getInstance().setBossStatus(29118, 0);
+			DoorTable.getInstance().getDoor(20240001).openMe();
+		}
+	}
+	
+	private static class Cast implements Runnable
+	{
+		L2Skill _skill;
+		L2Npc _npc;
+		
+		public Cast(L2Skill skill, L2Npc npc)
+		{
+			_skill = skill;
+			_npc = npc;
+		}
+		
+		@Override
+		public void run()
+		{
+			_npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+			if ((_npc != null) && !_npc.isDead() && !_npc.isCastingNow())
+			{
+				_npc.doCast(_skill);
+			}
+		}
+	}
+	
+	private static class Spawn implements Runnable
+	{
+		private int _taskId = 0;
+		
+		public Spawn(int taskId)
+		{
+			_taskId = taskId;
+		}
+		
+		@Override
+		public void run()
+		{
+			try
+			{
+				int instanceId = 0;
+				switch (_taskId)
+				{
+					case 1:
+						movie = true;
+						for (L2Character npc : _zone.getCharactersInsideArray())
+						{
+							if (npc instanceof L2Npc)
+							{
+								npc.deleteMe();
+							}
+						}
+						camera = spawn(29120, new int[]
+						{
+							16323, 213142, -9357, 0
+						}, instanceId);
+						camera2 = spawn(29121, new int[]
+						{
+							16323, 210741, -9357, 0
+						}, instanceId);
+						camera3 = spawn(29122, new int[]
+						{
+							16323, 213170, -9357, 0
+						}, instanceId);
+						camera4 = spawn(29123, new int[]
+						{
+							16323, 214917, -9356, 0
+						}, instanceId);
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(2), 300);
+						break;
+					case 2:
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 1800, -45, -45, 5000, 5000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(3), 4900);
+						break;
+					case 3:
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 2500, -120, -45, 5000, 5000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(4), 4900);
+						break;
+					case 4:
+						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 2200, 130, 0, 0, 1500, -20, 15, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(5), 1400);
+						break;
+					case 5:
+						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 2300, 100, 0, 2000, 4500, 0, 10, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(6), 2500);
+						break;
+					case 6:
+						L2DoorInstance door = DoorTable.getInstance().getDoor(20240001);
+						door.closeMe();
+						_zone.broadcastPacket(new StaticObject(door, false));
+						_zone.broadcastPacket(new DoorStatusUpdate(door));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(7), 1700);
+						break;
+					case 7:
+						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 1500, 210, 0, 0, 1500, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 5000, 6500, 0, 10, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(8), 6000);
+						break;
+					case 8:
+						spawn(29125, new int[]
+						{
+							16323, 214917, -9356, 0
+						}, instanceId);
+						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 0, 1500, 0, 10, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(9), 1000);
+						break;
+					case 9:
+						_zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 1000, 255, 0, 7000, 17000, 0, 25, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(10), 3000);
+						break;
+					case 10:
+						beleth = spawn(29118, new int[]
+						{
+							16321, 214211, -9352, 49369
+						}, instanceId);
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(11), 200);
+						break;
+					case 11:
+						_zone.broadcastPacket(new SocialAction(beleth, 1));
+						for (int i = 0; i < 6; i++)
+						{
+							int x = (int) ((150 * Math.cos(i * 1.046666667)) + 16323);
+							int y = (int) ((150 * Math.sin(i * 1.046666667)) + 213059);
+							L2Npc minion = spawn(29119, new int[]
+							{
+								x, y, -9357, 49152
+							}, beleth.getInstanceId());
+							minion.setShowSummonAnimation(true);
+							minion.decayMe();
+							minions.add(minion);
+						}
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(12), 6800);
+						break;
+					case 12:
+						_zone.broadcastPacket(new SpecialCamera(beleth.getObjectId(), 0, 270, -5, 0, 4000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(13), 3500);
+						break;
+					case 13:
+						_zone.broadcastPacket(new SpecialCamera(beleth.getObjectId(), 800, 270, 10, 3000, 6000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(14), 5000);
+						break;
+					case 14:
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(15), 100);
+						break;
+					case 15:
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 3000, 6000, 0, 5, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(16), 1400);
+						break;
+					case 16:
+						beleth.teleToLocation(16323, 213059, -9357, 49152, false);
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(17), 200);
+						break;
+					case 17:
+						_zone.broadcastPacket(new MagicSkillUse(beleth, beleth, 5532, 1, 2000, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(18), 2000);
+						break;
+					case 18:
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 700, 270, 20, 1500, 8000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(19), 6900);
+						break;
+					case 19:
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 40, 260, 0, 0, 4000, 0, 0, 1, 0));
+						for (L2Npc blth : minions)
+						{
+							blth.spawnMe();
+						}
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(20), 3000);
+						break;
+					case 20:
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 40, 280, 0, 0, 4000, 5, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(21), 3000);
+						break;
+					case 21:
+						_zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 5, 250, 5, 0, 13000, 20, 15, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(22), 1000);
+						break;
+					case 22:
+						_zone.broadcastPacket(new SocialAction(beleth, 3));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(23), 4000);
+						break;
+					case 23:
+						_zone.broadcastPacket(new MagicSkillUse(beleth, beleth, 5533, 1, 2000, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(24), 6800);
+						break;
+					case 24:
+						beleth.deleteMe();
+						for (L2Npc bel : minions)
+						{
+							bel.deleteMe();
+						}
+						minions.clear();
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(25), 1000);
+						break;
+					case 25:
+						camera.deleteMe();
+						camera2.deleteMe();
+						camera3.deleteMe();
+						camera4.deleteMe();
+						movie = false;
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
+						break;
+					case 26:
+						if (spawnTimer != null)
+						{
+							spawnTimer.cancel(false);
+							spawnTimer = null;
+						}
+						SpawnBeleths();
+						break;
+					case 27:
+						beleth.doDie(null);
+						camera = spawn(29122, new int[]
+						{
+							16323, 213170, -9357, 0
+						}, instanceId);
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 110, 25, 4000, 10000, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SocialAction(beleth, 5));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(28), 4000);
+						break;
+					case 28:
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 295, 25, 4000, 5000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(29), 4500);
+						break;
+					case 29:
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 295, 10, 4000, 11000, 0, 25, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(30), 9000);
+						break;
+					case 30:
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 1000, 0, 0, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 10000, 0, 0, 1, 0));
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(31), 2000);
+						break;
+					case 31:
+						priest.spawnMe();
+						beleth.deleteMe();
+						camera2 = spawn(29121, new int[]
+						{
+							14056, 213170, -9357, 0
+						}, instanceId);
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(32), 3500);
+						break;
+					case 32:
+						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
+						_zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
+						L2DoorInstance door2 = DoorTable.getInstance().getDoor(20240002);
+						door2.openMe();
+						_zone.broadcastPacket(new StaticObject(door2, false));
+						_zone.broadcastPacket(new DoorStatusUpdate(door2));
+						DoorTable.getInstance().getDoor(20240003).openMe();
+						ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(33), 4000);
+						break;
+					case 33:
+						camera.deleteMe();
+						camera2.deleteMe();
+						movie = false;
+						break;
+					case 333:
+						beleth = spawn(29118, new int[]
+						{
+							16323, 213170, -9357, 49152
+						}, 0);
+						break;
+				
+				}
+			}
+			catch (Exception e)
+			{
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	@Override
+	public String onEnterZone(L2Character character, L2ZoneType zone)
+	{
+		if (((character instanceof L2PcInstance) && (GrandBossManager.getInstance().getBossStatus(29118) == 1)) || (debug && (GrandBossManager.getInstance().getBossStatus(29118) != 2) && (character instanceof L2PcInstance)))
+		{
+			startSpawnTask();
+			GrandBossManager.getInstance().setBossStatus(29118, 2);
+		}
+		return null;
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance player, boolean isPet)
+	{
+		if ((npc.getNpcId() == 29118) && (player != null))
+		{
+			if (player.getParty() != null)
+			{
+				if (player.getParty().getCommandChannel() != null)
+				{
+					belethKiller = player.getParty().getCommandChannel().getChannelLeader();
+				}
+				else
+				{
+					belethKiller = player.getParty().getLeader();
+				}
+			}
+			else
+			{
+				belethKiller = player;
+			}
+			GrandBossManager.getInstance().setBossStatus(29118, 3);
+			long respawnTime = (long) Config.INTERVAL_OF_BELETH_SPAWN + Rnd.get(Config.RANDOM_OF_BELETH_SPAWN);
+			StatsSet info = GrandBossManager.getInstance().getStatsSet(29118);
+			info.set("respawn_time", System.currentTimeMillis() + respawnTime);
+			GrandBossManager.getInstance().setStatsSet(29118, info);
+			ThreadPoolManager.getInstance().scheduleGeneral(new unlock(), respawnTime);
+			deleteAll();
+			if (npc != null)
+			{
+				npc.deleteMe();
+			}
+			movie = true;
+			beleth = spawn(29118, new int[]
+			{
+				16323, 213170, -9357, 49152
+			}, 0);
+			beleth.setIsInvul(true);
+			beleth.setIsImmobilized(true);
+			beleth.disableAllSkills();
+			priest = spawn(29128, new int[]
+			{
+				beleth.getX(), beleth.getY(), beleth.getZ(), beleth.getHeading()
+			}, 0);
+			priest.setShowSummonAnimation(true);
+			priest.decayMe();
+			spawn(32470, new int[]
+			{
+				12470, 215607, -9381, 49152
+			}, 0);
+			ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(27), 1000);
+		}
+		else if (npc.getNpcId() == 29119)
+		{
+			if (npc.getObjectId() == allowObjectId)
+			{
+				minions.remove(npc);
+				killed++;
+				if (killed >= 5)
+				{
+					deleteAll();
+					spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(333), 60000);
+				}
+				else
+				{
+					allowObjectId = minions.get(Rnd.get(minions.size())).getObjectId();
+					attacked = false;
+				}
+			}
+			else if (spawnTimer == null)
+			{
+				deleteAll();
+				spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
+				killed = 0;
+			}
+			npc.abortCast();
+			npc.setTarget(null);
+			npc.deleteMe();
+		}
+		return null;
+	}
+	
+	@Override
+	public String onSkillSee(L2Npc npc, L2PcInstance player, L2Skill skill, L2Object[] targets, boolean isPet)
+	{
+		if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && (skill.getSkillType() == L2SkillType.HEAL) && (Rnd.get(100) < 80))
+		{
+			npc.setTarget(player);
+			npc.doCast(HornOfRising);
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isPet)
+	{
+		if ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119))
+		{
+			if ((npc.getObjectId() == allowObjectId) && !attacked)
+			{
+				attacked = true;
+				L2Npc fakeBeleth = minions.get(Rnd.get(minions.size()));
+				while (fakeBeleth.getObjectId() == allowObjectId)
+				{
+					fakeBeleth = minions.get(Rnd.get(minions.size()));
+				}
+				_zone.broadcastPacket(new CreatureSay(fakeBeleth.getObjectId(), 0, fakeBeleth.getName(), "Miss text."));
+			}
+			if (Rnd.get(100) < 40)
+			{
+				return null;
+			}
+			final double distance = Math.sqrt(npc.getPlanDistanceSq(player.getX(), player.getY()));
+			if ((distance > 500) || (Rnd.get(100) < 80))
+			{
+				for (L2Npc beleth : minions)
+				{
+					if ((beleth != null) && !beleth.isDead() && Util.checkIfInRange(900, beleth, player, false) && !beleth.isCastingNow())
+					{
+						beleth.setTarget(player);
+						beleth.doCast(Fireball);
+					}
+				}
+				if ((beleth != null) && !beleth.isDead() && Util.checkIfInRange(900, beleth, player, false) && !beleth.isCastingNow())
+				{
+					beleth.setTarget(player);
+					beleth.doCast(Fireball);
+				}
+			}
+			else if ((npc != null) && !npc.isDead() && !npc.isCastingNow())
+			{
+				if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
+				{
+					npc.doCast(Lightening);
+					return null;
+				}
+				((L2Attackable) npc).clearAggroList();
+			}
+		}
+		return null;
+	}
+	
+	@Override
+	public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill)
+	{
+		if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow())
+		{
+			if ((player != null) && !player.isDead())
+			{
+				final double distance2 = Math.sqrt(npc.getPlanDistanceSq(player.getX(), player.getY()));
+				if ((distance2 > 890) && !npc.isMovementDisabled())
+				{
+					npc.setTarget(player);
+					npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player);
+					int speed = npc.isRunning() ? npc.getRunSpeed() : npc.getWalkSpeed();
+					int time = (int) (((distance2 - 890) / speed) * 1000);
+					ThreadPoolManager.getInstance().scheduleGeneral(new Cast(Fireball, npc), time);
+					
+				}
+				else if (distance2 < 890)
+				{
+					npc.setTarget(player);
+					npc.doCast(Fireball);
+				}
+				return null;
+			}
+			if (Rnd.get(100) < 40)
+			{
+				if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
+				{
+					npc.doCast(Lightening);
+					return null;
+				}
+			}
+			for (L2PcInstance plr : npc.getKnownList().getKnownPlayersInRadius(950))
+			{
+				npc.setTarget(plr);
+				npc.doCast(Fireball);
+				return null;
+			}
+			((L2Attackable) npc).clearAggroList();
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
+	{
+		if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && !movie)
+		{
+			if (Rnd.get(100) < 40)
+			{
+				if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
+				{
+					npc.doCast(Bleed);
+					return null;
+				}
+			}
+			npc.setTarget(player);
+			npc.doCast(Fireball);
+		}
+		return null;
+	}
+	
+	@Override
+	public String onSpawn(L2Npc npc)
+	{
+		if ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119))
+		{
+			npc.setRunning();
+			if (!movie && !npc.getKnownList().getKnownPlayersInRadius(300).isEmpty() && (Rnd.get(100) < 60))
+			{
+				npc.doCast(Bleed);
+			}
+			if (npc.getNpcId() == 29118)
+			{
+				npc.getSpawn().setRespawnDelay(0);// setOnKillDelay
+			}
+		}
+		return null;
+	}
+	
+	@Override
+	public String onTalk(L2Npc npc, L2PcInstance player)
+	{
+		if ((belethKiller != null) && (player.getObjectId() == belethKiller.getObjectId()))
+		{
+			player.addItem("Kill Beleth", 10314, 1, null, true);// giveItems(10314, 1, 0)
+			belethKiller = null;
+			return "<html><body>Stone Coffin:<br> You open the lid and are immediately flooded by a dark and gloomy aura. It appears that something is happening...</body></html>";
+		}
+		else
+		{
+			return "<html><body>Stone Coffin:<br> The lid doesn't budge - it seems to be held firmly in place by some unknown force. This coffin must be the object that Beleth bequeaths to the leader of the attacking forces.";
+		}
+	}
+	
+	@Override
+	public String onFirstTalk(L2Npc npc, L2PcInstance player)
+	{
+		return null;
+	}
+	
+	private static void deleteAll()
+	{
+		if ((minions != null) && !minions.isEmpty())
+		{
+			for (L2Npc npc : minions)
+			{
+				if ((npc == null) || npc.isDead())
+				{
+					continue;
+				}
+				npc.abortCast();
+				npc.setTarget(null);
+				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+				npc.deleteMe();
+			}
+		}
+		minions.clear();
+		allowObjectId = 0;
+		attacked = false;
+	}
+	
+	private static void SpawnBeleths()
+	{
+		int a = 0;
+		L2Npc npc;
+		for (int i = 0; i < 16; i++)
+		{
+			a++;
+			int x = (int) ((650 * Math.cos(i * 0.39)) + 16323);
+			int y = (int) ((650 * Math.sin(i * 0.39)) + 213170);
+			npc = spawn(29119, new int[]
+			{
+				x, y, -9357, 49152
+			}, 0);
+			minions.add(npc);
+			if (a >= 2)
+			{
+				npc.setIsOverloaded(true);
+				a = 0;
+			}
+		}
+		int[] xm = new int[16];
+		int[] ym = new int[16];
+		for (int i = 0; i < 4; i++)
+		{
+			xm[i] = (int) ((1700 * Math.cos((i * 1.57) + 0.78)) + 16323);
+			ym[i] = (int) ((1700 * Math.sin((i * 1.57) + 0.78)) + 213170);
+			npc = spawn(29119, new int[]
+			{
+				xm[i], ym[i], -9357, 49152
+			}, 0);
+			npc.setIsOverloaded(true);
+			minions.add(npc);
+		}
+		xm[4] = (xm[0] + xm[1]) / 2;
+		ym[4] = (ym[0] + ym[1]) / 2;
+		npc = spawn(29119, new int[]
+		{
+			xm[4], ym[4], -9357, 49152
+		}, 0);
+		npc.setIsOverloaded(true);
+		minions.add(npc);
+		xm[5] = (xm[1] + xm[2]) / 2;
+		ym[5] = (ym[1] + ym[2]) / 2;
+		npc = spawn(29119, new int[]
+		{
+			xm[5], ym[5], -9357, 49152
+		}, 0);
+		npc.setIsOverloaded(true);
+		minions.add(npc);
+		xm[6] = (xm[2] + xm[3]) / 2;
+		ym[6] = (ym[2] + ym[3]) / 2;
+		npc = spawn(29119, new int[]
+		{
+			xm[6], ym[6], -9357, 49152
+		}, 0);
+		npc.setIsOverloaded(true);
+		minions.add(npc);
+		xm[7] = (xm[3] + xm[0]) / 2;
+		ym[7] = (ym[3] + ym[0]) / 2;
+		npc = spawn(29119, new int[]
+		{
+			xm[7], ym[7], -9357, 49152
+		}, 0);
+		npc.setIsOverloaded(true);
+		minions.add(npc);
+		xm[8] = (xm[0] + xm[4]) / 2;
+		ym[8] = (ym[0] + ym[4]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[8], ym[8], -9357, 49152
+		}, 0));
+		xm[9] = (xm[4] + xm[1]) / 2;
+		ym[9] = (ym[4] + ym[1]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[9], ym[9], -9357, 49152
+		}, 0));
+		xm[10] = (xm[1] + xm[5]) / 2;
+		ym[10] = (ym[1] + ym[5]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[10], ym[10], -9357, 49152
+		}, 0));
+		xm[11] = (xm[5] + xm[2]) / 2;
+		ym[11] = (ym[5] + ym[2]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[11], ym[11], -9357, 49152
+		}, 0));
+		xm[12] = (xm[2] + xm[6]) / 2;
+		ym[12] = (ym[2] + ym[6]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[12], ym[12], -9357, 49152
+		}, 0));
+		xm[13] = (xm[6] + xm[3]) / 2;
+		ym[13] = (ym[6] + ym[3]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[13], ym[13], -9357, 49152
+		}, 0));
+		xm[14] = (xm[3] + xm[7]) / 2;
+		ym[14] = (ym[3] + ym[7]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[14], ym[14], -9357, 49152
+		}, 0));
+		xm[15] = (xm[7] + xm[0]) / 2;
+		ym[15] = (ym[7] + ym[0]) / 2;
+		minions.add(spawn(29119, new int[]
+		{
+			xm[15], ym[15], -9357, 49152
+		}, 0));
+		allowObjectId = minions.get(Rnd.get(minions.size())).getObjectId();
+		attacked = false;
+	}
+	
+	public static void main(String[] args)
+	{
+		new Beleth(-1, "Beleth", "ai");
+	}
+}

+ 130 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DemonPrince.java

@@ -0,0 +1,130 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.Map;
+
+import javolution.util.FastMap;
+import ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.skills.SkillHolder;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author GKR
+ */
+public class DemonPrince extends L2AttackableAIScript
+{
+	private static final int DEMON_PRINCE = 25540;
+	private static final int FIEND = 25541;
+	
+	private static final SkillHolder UD = new SkillHolder(5044, 2);
+	private static final SkillHolder[] AOE =
+	{
+		new SkillHolder(5376, 4), new SkillHolder(5376, 5), new SkillHolder(5376, 6)
+	};
+	
+	private static final Map<Integer, Boolean> _attackState = new FastMap<Integer, Boolean>();
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("cast") && (npc != null) && (npc.getNpcId() == FIEND) && !npc.isDead())
+		{
+			npc.doCast(AOE[Rnd.get(3)].getSkill());
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet, L2Skill skill)
+	{
+		if ((npc.getNpcId() == DEMON_PRINCE) && !npc.isDead())
+		{
+			if (!_attackState.containsKey(npc.getObjectId()) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.5)))
+			{
+				npc.doCast(UD.getSkill());
+				spawnMinions(npc);
+				_attackState.put(npc.getObjectId(), false);
+			}
+			else if ((npc.getCurrentHp() < (npc.getMaxHp() * 0.1)) && _attackState.containsKey(npc.getObjectId()) && (_attackState.get(npc.getObjectId()) == false))
+			{
+				npc.doCast(UD.getSkill());
+				spawnMinions(npc);
+				_attackState.put(npc.getObjectId(), true);
+			}
+			
+			if (Rnd.get(1000) < 10)
+			{
+				spawnMinions(npc);
+			}
+		}
+		return super.onAttack(npc, attacker, damage, isPet, skill);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (npc.getNpcId() == DEMON_PRINCE)
+		{
+			_attackState.remove(npc.getObjectId());
+		}
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if (npc.getNpcId() == FIEND)
+		{
+			startQuestTimer("cast", 15000, npc, null);
+		}
+		return super.onSpawn(npc);
+	}
+	
+	private void spawnMinions(L2Npc master)
+	{
+		if ((master != null) && !master.isDead())
+		{
+			int instanceId = master.getInstanceId();
+			int x = master.getX();
+			int y = master.getY();
+			int z = master.getZ();
+			addSpawn(FIEND, x + 200, y, z, 0, false, 0, false, instanceId);
+			addSpawn(FIEND, x - 200, y, z, 0, false, 0, false, instanceId);
+			addSpawn(FIEND, x - 100, y - 140, z, 0, false, 0, false, instanceId);
+			addSpawn(FIEND, x - 100, y + 140, z, 0, false, 0, false, instanceId);
+			addSpawn(FIEND, x + 100, y - 140, z, 0, false, 0, false, instanceId);
+			addSpawn(FIEND, x + 100, y + 140, z, 0, false, 0, false, instanceId);
+		}
+	}
+	
+	public DemonPrince(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		addAttackId(DEMON_PRINCE);
+		addKillId(DEMON_PRINCE);
+		addSpawnId(FIEND);
+	}
+	
+	public static void main(String[] args)
+	{
+		new DemonPrince(-1, "DemonPrince", "ai");
+	}
+}

+ 136 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Epidos.java

@@ -0,0 +1,136 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.Arrays;
+import java.util.Map;
+
+import javolution.util.FastMap;
+import ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.util.MinionList;
+import com.l2jserver.util.Rnd;
+
+/**
+ * Manages minion's spawn, idle despawn and Teleportation Cube spawn.
+ * @author GKR
+ */
+public class Epidos extends L2AttackableAIScript
+{
+	private static final int[] EPIDOSES =
+	{
+		25609, 25610, 25611, 25612
+	};
+	private static final int[] MINIONS =
+	{
+		25605, 25606, 25607, 25608
+	};
+	private static final int[] MINIONS_COUNT =
+	{
+		3, 6, 11
+	};
+	
+	private final Map<Integer, Double> _lastHp = new FastMap<Integer, Double>();
+	
+	@Override
+	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("check_minions"))
+		{
+			if ((Rnd.get(1000) > 250) && _lastHp.containsKey(npc.getObjectId()))
+			{
+				int hpDecreasePercent = (int) (((_lastHp.get(npc.getObjectId()) - npc.getCurrentHp()) * 100) / npc.getMaxHp());
+				int minionsCount = 0;
+				int spawnedMinions = ((L2MonsterInstance) npc).getMinionList().countSpawnedMinions();
+				
+				if ((hpDecreasePercent > 5) && (hpDecreasePercent <= 15) && (spawnedMinions <= 9))
+				{
+					minionsCount = MINIONS_COUNT[0];
+				}
+				else if ((((hpDecreasePercent > 1) && (hpDecreasePercent <= 5)) || ((hpDecreasePercent > 15) && (hpDecreasePercent <= 30))) && (spawnedMinions <= 6))
+				{
+					minionsCount = MINIONS_COUNT[1];
+				}
+				else if (spawnedMinions == 0)
+				{
+					minionsCount = MINIONS_COUNT[2];
+				}
+				
+				for (int i = 0; i < minionsCount; i++)
+				{
+					MinionList.spawnMinion((L2MonsterInstance) npc, MINIONS[Arrays.binarySearch(EPIDOSES, npc.getNpcId())]);
+				}
+				
+				_lastHp.put(npc.getObjectId(), npc.getCurrentHp());
+			}
+			
+			startQuestTimer("check_minions", 10000, npc, null);
+		}
+		else if (event.equalsIgnoreCase("check_idle"))
+		{
+			if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ACTIVE)
+			{
+				npc.deleteMe();
+			}
+			else
+			{
+				startQuestTimer("check_idle", 600000, npc, null);
+			}
+		}
+		return null;
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (npc.isInsideRadius(-45474, 247450, -13994, 2000, true, false))
+		{
+			addSpawn(32376, -45482, 246277, -14184, 0, false, 0, false);
+		}
+		
+		_lastHp.remove(npc.getObjectId());
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		startQuestTimer("check_minions", 10000, npc, null);
+		startQuestTimer("check_idle", 600000, npc, null);
+		_lastHp.put(npc.getObjectId(), (double) npc.getMaxHp());
+		
+		return super.onSpawn(npc);
+	}
+	
+	public Epidos(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		for (int i : EPIDOSES)
+		{
+			addKillId(i);
+			addSpawnId(i);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new Epidos(-1, "Epidos", "ai");
+	}
+}

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

@@ -0,0 +1,72 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.skills.SkillHolder;
+
+/**
+ * Manages Naia's cast on the Hellbound Core
+ * @author GKR
+ */
+public class HellboundCore extends Quest
+{
+	private static final int NAIA = 18484;
+	private static final int HELLBOUND_CORE = 32331;
+	
+	private static SkillHolder BEAM = new SkillHolder(5493, 1);
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("cast") && (HellboundManager.getInstance().getLevel() <= 6))
+		{
+			for (L2Character naia : npc.getKnownList().getKnownCharactersInRadius(900))
+			{
+				if ((naia != null) && (naia instanceof L2MonsterInstance) && (((L2MonsterInstance) naia).getNpcId() == NAIA) && !naia.isDead())
+				{
+					naia.setTarget(npc);
+					naia.doSimultaneousCast(BEAM.getSkill());
+				}
+			}
+			startQuestTimer("cast", 10000, npc, null);
+		}
+		return null;
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		startQuestTimer("cast", 10000, npc, null);
+		return super.onSpawn(npc);
+	}
+	
+	public HellboundCore(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		addSpawnId(HELLBOUND_CORE);
+	}
+	
+	public static void main(String[] args)
+	{
+		new HellboundCore(-1, "HellboundCore", "ai");
+	}
+}

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

@@ -0,0 +1,297 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.List;
+
+import javolution.util.FastList;
+
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+
+/**
+ * Manages Darion's Enforcer's and Darion's Executioner spawn/despawn
+ * @author GKR
+ */
+public class Keltas extends Quest
+{
+	private static final int KELTAS = 22341;
+	private static final int ENFORCER = 22342;
+	private static final int EXECUTIONER = 22343;
+	
+	private L2MonsterInstance spawnedKeltas = null;
+	
+	private final List<L2Spawn> spawnedMonsters;
+	
+	private static final int[][] ENFORCER_SPAWN_POINTS =
+	{
+		{
+			-24540, 251404, -3320
+		},
+		{
+			-24100, 252578, -3060
+		},
+		{
+			-24607, 252443, -3074
+		},
+		{
+			-23962, 252041, -3275
+		},
+		{
+			-24381, 252132, -3090
+		},
+		{
+			-23652, 251838, -3370
+		},
+		{
+			-23838, 252603, -3095
+		},
+		{
+			-23257, 251671, -3360
+		},
+		{
+			-27127, 251106, -3523
+		},
+		{
+			-27118, 251203, -3523
+		},
+		{
+			-27052, 251205, -3523
+		},
+		{
+			-26999, 250818, -3523
+		},
+		{
+			-29613, 252888, -3523
+		},
+		{
+			-29765, 253009, -3523
+		},
+		{
+			-29594, 252570, -3523
+		},
+		{
+			-29770, 252658, -3523
+		},
+		{
+			-27816, 252008, -3527
+		},
+		{
+			-27930, 252011, -3523
+		},
+		{
+			-28702, 251986, -3523
+		},
+		{
+			-27357, 251987, -3527
+		},
+		{
+			-28859, 251081, -3527
+		},
+		{
+			-28607, 250397, -3523
+		},
+		{
+			-28801, 250462, -3523
+		},
+		{
+			-29123, 250387, -3472
+		},
+		{
+			-25376, 252368, -3257
+		},
+		{
+			-25376, 252208, -3257
+		}
+	};
+	
+	private static final int[][] EXECUTIONER_SPAWN_POINTS =
+	{
+		{
+			-24419, 251395, -3340
+		},
+		{
+			-24912, 252160, -3310
+		},
+		{
+			-25027, 251941, -3300
+		},
+		{
+			-24127, 252657, -3058
+		},
+		{
+			-25120, 252372, -3270
+		},
+		{
+			-24456, 252651, -3060
+		},
+		{
+			-24844, 251614, -3295
+		},
+		{
+			-28675, 252008, -3523
+		},
+		{
+			-27943, 251238, -3523
+		},
+		{
+			-27827, 251984, -3523
+		},
+		{
+			-27276, 251995, -3523
+		},
+		{
+			-28769, 251955, -3523
+		},
+		{
+			-27969, 251073, -3523
+		},
+		{
+			-27233, 250938, -3523
+		},
+		{
+			-26835, 250914, -3523
+		},
+		{
+			-26802, 251276, -3523
+		},
+		{
+			-29671, 252781, -3527
+		},
+		{
+			-29536, 252831, -3523
+		},
+		{
+			-29419, 253214, -3523
+		},
+		{
+			-27923, 251965, -3523
+		},
+		{
+			-28499, 251882, -3527
+		},
+		{
+			-28194, 251915, -3523
+		},
+		{
+			-28358, 251078, -3527
+		},
+		{
+			-28580, 251071, -3527
+		},
+		{
+			-28492, 250704, -3523
+		}
+	};
+	
+	private void spawnMinions()
+	{
+		for (int[] pos : ENFORCER_SPAWN_POINTS)
+		{
+			L2MonsterInstance minion = (L2MonsterInstance) addSpawn(ENFORCER, pos[0], pos[1], pos[2], 0, false, 0, false);
+			minion.getSpawn().setRespawnDelay(60);
+			minion.getSpawn().setAmount(1);
+			minion.getSpawn().startRespawn();
+			spawnedMonsters.add(minion.getSpawn());
+		}
+		
+		for (int[] pos : EXECUTIONER_SPAWN_POINTS)
+		{
+			L2MonsterInstance minion = (L2MonsterInstance) addSpawn(EXECUTIONER, pos[0], pos[1], pos[2], 0, false, 0, false);
+			minion.getSpawn().setRespawnDelay(80);
+			minion.getSpawn().setAmount(1);
+			minion.getSpawn().startRespawn();
+			spawnedMonsters.add(minion.getSpawn());
+		}
+	}
+	
+	private void despawnMinions()
+	{
+		if ((spawnedMonsters == null) || spawnedMonsters.isEmpty())
+		{
+			return;
+		}
+		
+		for (L2Spawn spawn : spawnedMonsters)
+		{
+			spawn.stopRespawn();
+			L2Npc minion = spawn.getLastSpawn();
+			if ((minion != null) && !minion.isDead())
+			{
+				minion.deleteMe();
+			}
+		}
+		spawnedMonsters.clear();
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("despawn"))
+		{
+			if ((spawnedKeltas != null) && !spawnedKeltas.isDead())
+			{
+				spawnedKeltas.broadcastPacket(new NpcSay(spawnedKeltas.getObjectId(), Say2.SHOUT, spawnedKeltas.getNpcId(), NpcStringId.THAT_IS_IT_FOR_TODAYLETS_RETREAT_EVERYONE_PULL_BACK));
+				spawnedKeltas.deleteMe();
+				spawnedKeltas.getSpawn().decreaseCount(spawnedKeltas);
+				despawnMinions();
+			}
+		}
+		return null;
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		cancelQuestTimers("despawn");
+		despawnMinions();
+		
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if (!npc.isTeleporting())
+		{
+			spawnedKeltas = (L2MonsterInstance) npc;
+			npc.broadcastPacket(new NpcSay(spawnedKeltas.getObjectId(), Say2.SHOUT, spawnedKeltas.getNpcId(), NpcStringId.GUYS_SHOW_THEM_OUR_POWER));
+			spawnMinions();
+			startQuestTimer("despawn", 1800000, null, null);
+		}
+		return super.onSpawn(npc);
+	}
+	
+	public Keltas(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		addKillId(KELTAS);
+		addSpawnId(KELTAS);
+		
+		spawnedMonsters = new FastList<L2Spawn>();
+	}
+	
+	public static void main(String[] args)
+	{
+		new Keltas(-1, "keltas", "ai");
+	}
+}

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

@@ -0,0 +1,48 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * Removes minions after master's death
+ * @author GKR
+ */
+public class NaiaLock extends L2AttackableAIScript
+{
+	private static final int LOCK = 18491;
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		((L2MonsterInstance) npc).getMinionList().onMasterDie(true);
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	public NaiaLock(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		addKillId(LOCK);
+	}
+	
+	public static void main(String[] args)
+	{
+		new NaiaLock(-1, "NaiaLock", "ai");
+	}
+}

+ 96 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/OutpostCaptain.java

@@ -0,0 +1,96 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 com.l2jserver.gameserver.datatables.DoorTable;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+
+/**
+ * @author DS
+ */
+public class OutpostCaptain extends Quest
+{
+	private static final int CAPTAIN = 18466;
+	private static final int[] DEFENDERS =
+	{
+		22357, 22358
+	};
+	private static final int DOORKEEPER = 32351;
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("level_up"))
+		{
+			npc.deleteMe();
+			HellboundManager.getInstance().setLevel(9);
+		}
+		return null;
+	}
+	
+	@Override
+	public final String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (HellboundManager.getInstance().getLevel() == 8)
+		{
+			addSpawn(DOORKEEPER, npc.getSpawn().getLocx(), npc.getSpawn().getLocy(), npc.getSpawn().getLocz(), 0, false, 0, false);
+		}
+		
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		npc.setIsNoRndWalk(true);
+		
+		if (npc.getNpcId() == CAPTAIN)
+		{
+			L2DoorInstance door = DoorTable.getInstance().getDoor(20250001);
+			if (door != null)
+			{
+				door.closeMe();
+			}
+		}
+		else if (npc.getNpcId() == DOORKEEPER)
+		{
+			startQuestTimer("level_up", 3000, npc, null);
+		}
+		
+		return super.onSpawn(npc);
+	}
+	
+	public OutpostCaptain(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		addKillId(CAPTAIN);
+		addSpawnId(CAPTAIN);
+		addSpawnId(DOORKEEPER);
+		
+		for (int i : DEFENDERS)
+		{
+			addSpawnId(i);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new OutpostCaptain(-1, OutpostCaptain.class.getSimpleName(), "ai");
+	}
+}

+ 130 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Ranku.java

@@ -0,0 +1,130 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 gnu.trove.TIntHashSet;
+import ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+import com.l2jserver.gameserver.util.MinionList;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author GKR
+ */
+public class Ranku extends L2AttackableAIScript
+{
+	private static final int RANKU = 25542;
+	private static final int MINION = 32305;
+	private static final int MINION_2 = 25543;
+	
+	private static TIntHashSet myTrackingSet = new TIntHashSet();
+	
+	@Override
+	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("checkup") && (npc.getNpcId() == RANKU) && !npc.isDead())
+		{
+			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
+			{
+				if ((minion != null) && !minion.isDead() && myTrackingSet.contains(minion.getObjectId()))
+				{
+					L2PcInstance[] players = minion.getKnownList().getKnownPlayers().values().toArray(new L2PcInstance[minion.getKnownList().getKnownPlayers().size()]);
+					L2PcInstance killer = players[Rnd.get(players.length)];
+					minion.reduceCurrentHp(minion.getMaxHp() / 100, killer, null);
+				}
+			}
+			startQuestTimer("checkup", 1000, npc, null);
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet, L2Skill skill)
+	{
+		if (npc.getNpcId() == RANKU)
+		{
+			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
+			{
+				if ((minion != null) && !minion.isDead() && !myTrackingSet.contains(minion.getObjectId()))
+				{
+					minion.broadcastPacket(new NpcSay(minion.getObjectId(), Say2.ALL, minion.getNpcId(), NpcStringId.DONT_KILL_ME_PLEASE_SOMETHINGS_STRANGLING_ME));
+					startQuestTimer("checkup", 1000, npc, null);
+					synchronized (myTrackingSet)
+					{
+						myTrackingSet.add(minion.getObjectId());
+					}
+				}
+			}
+		}
+		return super.onAttack(npc, attacker, damage, isPet, skill);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (npc.getNpcId() == MINION)
+		{
+			if (myTrackingSet.contains(npc.getObjectId()))
+			{
+				synchronized (myTrackingSet)
+				{
+					myTrackingSet.remove(npc.getObjectId());
+				}
+			}
+			
+			final L2MonsterInstance master = ((L2MonsterInstance) npc).getLeader();
+			if ((master != null) && !master.isDead())
+			{
+				L2MonsterInstance minion2 = MinionList.spawnMinion(master, MINION_2);
+				minion2.teleToLocation(npc.getX(), npc.getY(), npc.getZ());
+			}
+		}
+		else if (npc.getNpcId() == RANKU)
+		{
+			for (L2MonsterInstance minion : ((L2MonsterInstance) npc).getMinionList().getSpawnedMinions())
+			{
+				if (myTrackingSet.contains(minion.getObjectId()))
+				{
+					synchronized (myTrackingSet)
+					{
+						myTrackingSet.remove(minion.getObjectId());
+					}
+				}
+			}
+		}
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	public Ranku(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		addAttackId(RANKU);
+		addKillId(RANKU);
+		addKillId(MINION);
+	}
+	
+	public static void main(String[] args)
+	{
+		new Ranku(-1, "Ranku", "ai");
+	}
+}

+ 82 - 0
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinWardens.java

@@ -0,0 +1,82 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.Map;
+
+import javolution.util.FastMap;
+import ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+
+/**
+ * Manages Sin Wardens disappearing and chat
+ * @author GKR
+ */
+public class SinWardens extends L2AttackableAIScript
+{
+	private static final int[] SIN_WARDEN_MINIONS =
+	{
+		22424, 22425, 22426, 22427, 22428, 22429, 22430, 22432, 22433, 22434, 22435, 22436, 22437, 22438
+	};
+	
+	private final Map<Integer, Integer> killedMinionsCount = new FastMap<Integer, Integer>();
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (npc.isMinion())
+		{
+			L2MonsterInstance master = ((L2MonsterInstance) npc).getLeader();
+			if ((master != null) && !master.isDead())
+			{
+				int killedCount = killedMinionsCount.containsKey(master.getObjectId()) ? killedMinionsCount.get(master.getObjectId()) : 0;
+				killedCount++;
+				
+				if ((killedCount) == 5)
+				{
+					master.broadcastPacket(new NpcSay(master.getObjectId(), Say2.ALL, master.getNpcId(), NpcStringId.WE_MIGHT_NEED_NEW_SLAVES_ILL_BE_BACK_SOON_SO_WAIT));
+					master.doDie(killer);
+					killedMinionsCount.remove(master.getObjectId());
+				}
+				else
+				{
+					killedMinionsCount.put(master.getObjectId(), killedCount);
+				}
+			}
+		}
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	public SinWardens(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		for (int monsterId : SIN_WARDEN_MINIONS)
+		{
+			addKillId(monsterId);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new SinWardens(-1, "SinWardens", "ai");
+	}
+}

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

@@ -0,0 +1,81 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 ai.group_template.L2AttackableAIScript;
+
+import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2RaidBossInstance;
+import com.l2jserver.gameserver.skills.SkillHolder;
+
+/**
+ * @author GKR
+ */
+public class Typhoon extends L2AttackableAIScript
+{
+	private static final int TYPHOON = 25539;
+	
+	private static SkillHolder STORM = new SkillHolder(5434, 1);
+	
+	@Override
+	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("cast") && (npc != null) && !npc.isDead())
+		{
+			npc.doSimultaneousCast(STORM.getSkill());
+			startQuestTimer("cast", 5000, npc, null);
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
+	{
+		npc.doSimultaneousCast(STORM.getSkill());
+		return super.onAggroRangeEnter(npc, player, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if (!npc.isTeleporting())
+		{
+			startQuestTimer("cast", 5000, npc, null);
+		}
+		
+		return super.onSpawn(npc);
+	}
+	
+	public Typhoon(int id, String name, String descr)
+	{
+		super(id, name, descr);
+		
+		addAggroRangeEnterId(TYPHOON);
+		addSpawnId(TYPHOON);
+		
+		final L2RaidBossInstance boss = RaidBossSpawnManager.getInstance().getBosses().get(TYPHOON);
+		if (boss != null)
+		{
+			onSpawn(boss);
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new Typhoon(-1, "typhoon", "ai");
+	}
+}

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java

@@ -62,6 +62,7 @@ import handlers.admincommandhandlers.AdminGm;
 import handlers.admincommandhandlers.AdminGmChat;
 import handlers.admincommandhandlers.AdminGraciaSeeds;
 import handlers.admincommandhandlers.AdminHeal;
+import handlers.admincommandhandlers.AdminHellbound;
 import handlers.admincommandhandlers.AdminHelpPage;
 import handlers.admincommandhandlers.AdminInstance;
 import handlers.admincommandhandlers.AdminInstanceZone;
@@ -282,6 +283,7 @@ import handlers.voicedcommandhandlers.Banking;
 import handlers.voicedcommandhandlers.ChangePassword;
 import handlers.voicedcommandhandlers.ChatAdmin;
 import handlers.voicedcommandhandlers.Debug;
+import handlers.voicedcommandhandlers.Hellbound;
 import handlers.voicedcommandhandlers.Lang;
 import handlers.voicedcommandhandlers.TvTVoicedInfo;
 import handlers.voicedcommandhandlers.Wedding;
@@ -378,6 +380,7 @@ public class MasterHandler
 		ADMIN.registerAdminCommandHandler(new AdminGmChat());
 		ADMIN.registerAdminCommandHandler(new AdminGraciaSeeds());
 		ADMIN.registerAdminCommandHandler(new AdminHeal());
+		ADMIN.registerAdminCommandHandler(new AdminHellbound());
 		ADMIN.registerAdminCommandHandler(new AdminHelpPage());
 		ADMIN.registerAdminCommandHandler(new AdminInstance());
 		ADMIN.registerAdminCommandHandler(new AdminInstanceZone());
@@ -605,6 +608,8 @@ public class MasterHandler
 			VOICE.registerVoicedCommandHandler(new Debug());
 		if (Config.L2JMOD_ALLOW_CHANGE_PASSWORD)
 			VOICE.registerVoicedCommandHandler(new ChangePassword());
+		if (Config.L2JMOD_HELLBOUND_STATUS)
+			VOICE.registerVoicedCommandHandler(new Hellbound());
 		_log.log(Level.INFO, "Loaded " + VOICE.size() + " VoicedHandlers");
 	}
 	

+ 87 - 0
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminHellbound.java

@@ -0,0 +1,87 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.util.StringTokenizer;
+
+import com.l2jserver.gameserver.handler.IAdminCommandHandler;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+
+/**
+ * @author DS, Gladicek
+ */
+public class AdminHellbound implements IAdminCommandHandler
+{
+	private static final String[] ADMIN_COMMANDS =
+	{
+		"admin_hellbound_setlevel", "admin_hellbound"
+	};
+	
+	@Override
+	public String[] getAdminCommandList()
+	{
+		return ADMIN_COMMANDS;
+	}
+	
+	@Override
+	public boolean useAdminCommand(String command, L2PcInstance activeChar)
+	{
+		if (activeChar == null)
+		{
+			return false;
+		}
+		
+		if (command.startsWith(ADMIN_COMMANDS[0])) // setlevel
+		{
+			try
+			{
+				StringTokenizer st = new StringTokenizer(command, " ");
+				st.nextToken();
+				final int level = Integer.parseInt(st.nextToken());
+				if ((level < 0) || (level > 11))
+				{
+					throw new NumberFormatException();
+				}
+				HellboundManager.getInstance().setLevel(level);
+				activeChar.sendMessage("Hellbound level set to " + level);
+				return true;
+			}
+			catch (Exception e)
+			{
+				activeChar.sendMessage("Usage: //hellbound_setlevel 0-11");
+				return false;
+			}
+		}
+		else if (command.startsWith(ADMIN_COMMANDS[1])) // Admin menu by Gladicek
+		{
+			showMenu(activeChar);
+			return true;
+		}
+		return false;
+	}
+	
+	private void showMenu(L2PcInstance activeChar)
+	{
+		NpcHtmlMessage html = new NpcHtmlMessage(0);
+		html.setFile(activeChar.getHtmlPrefix(), "data/html/admin/hellbound.htm");
+		html.replace("%hbstage%", String.valueOf(HellboundManager.getInstance().getLevel()));
+		html.replace("%trust%", String.valueOf(HellboundManager.getInstance().getTrust()));
+		html.replace("%maxtrust%", String.valueOf(HellboundManager.getInstance().getMaxTrust()));
+		html.replace("%mintrust%", String.valueOf(HellboundManager.getInstance().getMinTrust()));
+		activeChar.sendPacket(html);
+	}
+}

+ 50 - 0
L2J_DataPack_BETA/dist/game/data/scripts/handlers/voicedcommandhandlers/Hellbound.java

@@ -0,0 +1,50 @@
+/*
+ * This program 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.
+ * 
+ * This program 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.voicedcommandhandlers;
+
+import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author DS
+ */
+public class Hellbound implements IVoicedCommandHandler
+{
+	private static final String[] VOICED_COMMANDS =
+	{
+		"hellbound"
+	};
+	
+	@Override
+	public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params)
+	{
+		if (HellboundManager.getInstance().isLocked())
+		{
+			activeChar.sendMessage("Hellbound is currently locked.");
+			return true;
+		}
+		
+		final int maxTrust = HellboundManager.getInstance().getMaxTrust();
+		activeChar.sendMessage("Hellbound level: " + HellboundManager.getInstance().getLevel() + " trust: " + HellboundManager.getInstance().getTrust() + (maxTrust > 0 ? "/" + maxTrust : ""));
+		return true;
+	}
+	
+	@Override
+	public String[] getVoicedCommandList()
+	{
+		return VOICED_COMMANDS;
+	}
+}

+ 315 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/AnomicFoundry/AnomicFoundry.java

@@ -0,0 +1,315 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 hellbound.AnomicFoundry;
+
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.datatables.SpawnTable;
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.instancemanager.WalkingManager;
+import com.l2jserver.gameserver.model.L2CharPosition;
+import com.l2jserver.gameserver.model.L2Skill;
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.network.NpcStringId;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.NpcSay;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author GKR
+ */
+public class AnomicFoundry extends Quest
+{
+	private static int LABORER = 22396;
+	private static int FOREMAN = 22397;
+	private static int LESSER_EVIL = 22398;
+	private static int GREATER_EVIL = 22399;
+	
+	// npcId, x, y, z, heading, max count
+	private static int[][] SPAWNS =
+	{
+		{
+			LESSER_EVIL, 27883, 248613, -3209, -13248, 5
+		},
+		{
+			LESSER_EVIL, 26142, 246442, -3216, 7064, 5
+		},
+		{
+			LESSER_EVIL, 27335, 246217, -3668, -7992, 5
+		},
+		{
+			LESSER_EVIL, 28486, 245913, -3698, 0, 10
+		},
+		{
+			GREATER_EVIL, 28684, 244118, -3700, -22560, 10
+		}
+	};
+	
+	private int respawnTime = 60000;
+	private final int respawnMin = 20000;
+	private final int respawnMax = 300000;
+	
+	private final int[] _spawned =
+	{
+		0, 0, 0, 0, 0
+	};
+	private final Map<Integer, Integer> _atkIndex = new FastMap<Integer, Integer>();
+	
+	public AnomicFoundry(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		
+		addAggroRangeEnterId(LABORER);
+		addAttackId(LABORER);
+		addKillId(LABORER);
+		addKillId(LESSER_EVIL);
+		addKillId(GREATER_EVIL);
+		addSpawnId(LABORER);
+		addSpawnId(LESSER_EVIL);
+		addSpawnId(GREATER_EVIL);
+		
+		startQuestTimer("make_spawn_1", respawnTime, null, null);
+	}
+	
+	@Override
+	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("make_spawn_1"))
+		{
+			if (HellboundManager.getInstance().getLevel() >= 10)
+			{
+				int idx = Rnd.get(3);
+				if (_spawned[idx] < SPAWNS[idx][5])
+				{
+					addSpawn(SPAWNS[idx][0], SPAWNS[idx][1], SPAWNS[idx][2], SPAWNS[idx][3], SPAWNS[idx][4], false, 0, false);
+					respawnTime += 10000;
+				}
+				startQuestTimer("make_spawn_1", respawnTime, null, null);
+			}
+		}
+		
+		else if (event.equalsIgnoreCase("make_spawn_2"))
+		{
+			if (_spawned[4] < SPAWNS[4][5])
+			{
+				addSpawn(SPAWNS[4][0], SPAWNS[4][1], SPAWNS[4][2], SPAWNS[4][3], SPAWNS[4][4], false, 0, false);
+			}
+		}
+		
+		else if (event.equalsIgnoreCase("return_laborer"))
+		{
+			if ((npc != null) && !npc.isDead())
+			{
+				((L2Attackable) npc).returnHome();
+			}
+		}
+		
+		else if (event.equalsIgnoreCase("reset_respawn_time"))
+		{
+			respawnTime = 60000;
+		}
+		
+		return null;
+	}
+	
+	@Override
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
+	{
+		// Announcements.getInstance().announceToAll("Aggro Range triggered");
+		if (Rnd.get(10000) < 2000)
+		{
+			requestHelp(npc, player, 500);
+		}
+		
+		return super.onAggroRangeEnter(npc, player, isPet);
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet, L2Skill skill)
+	{
+		int atkIndex = _atkIndex.containsKey(npc.getObjectId()) ? _atkIndex.get(npc.getObjectId()) : 0;
+		if (atkIndex == 0)
+		{
+			npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.ALL, npc.getNpcId(), NpcStringId.ENEMY_INVASION_HURRY_UP));
+			cancelQuestTimer("return_laborer", npc, null);
+			startQuestTimer("return_laborer", 60000, npc, null);
+			
+			if (respawnTime > respawnMin)
+			{
+				respawnTime -= 5000;
+			}
+			else if ((respawnTime <= respawnMin) && (getQuestTimer("reset_respawn_time", null, null) == null))
+			{
+				startQuestTimer("reset_respawn_time", 600000, null, null);
+			}
+		}
+		
+		if (Rnd.get(10000) < 2000)
+		{
+			atkIndex++;
+			_atkIndex.put(npc.getObjectId(), atkIndex);
+			requestHelp(npc, attacker, 1000 * atkIndex);
+			
+			if (Rnd.get(10) < 1)
+			{
+				npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition((npc.getX() + Rnd.get(-800, 800)), (npc.getY() + Rnd.get(-800, 800)), npc.getZ(), npc.getHeading()));
+			}
+		}
+		
+		return super.onAttack(npc, attacker, damage, isPet, skill);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		if (getSpawnGroup(npc) >= 0)
+		{
+			_spawned[getSpawnGroup(npc)]--;
+			SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
+		}
+		
+		else if (npc.getNpcId() == LABORER)
+		{
+			if (Rnd.get(10000) < 8000)
+			{
+				npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.ALL, npc.getNpcId(), NpcStringId.PROCESS_SHOULDNT_BE_DELAYED_BECAUSE_OF_ME));
+				if (respawnTime < respawnMax)
+				{
+					respawnTime += 10000;
+				}
+				else if ((respawnTime >= respawnMax) && (getQuestTimer("reset_respawn_time", null, null) == null))
+				{
+					startQuestTimer("reset_respawn_time", 600000, null, null);
+				}
+			}
+			_atkIndex.remove(npc.getObjectId());
+		}
+		
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	@Override
+	public final String onSpawn(L2Npc npc)
+	{
+		if (!npc.isTeleporting())
+		{
+			SpawnTable.getInstance().addNewSpawn(npc.getSpawn(), false);
+			if (getSpawnGroup(npc) >= 0)
+			{
+				_spawned[getSpawnGroup(npc)]++;
+			}
+			
+			// Announcements.getInstance().announceToAll("Spawned Evil in group " + Integer.toString(getSpawnGroup(npc)) + ". Total spawned = " + Integer.toString(_spawned[getSpawnGroup(npc)]));
+			
+			if (npc.getNpcId() == LABORER)
+			{
+				npc.setIsNoRndWalk(true);
+			}
+		}
+		
+		if ((getSpawnGroup(npc) >= 0) && (getSpawnGroup(npc) <= 2))
+		{
+			if (!npc.isTeleporting())
+			{
+				WalkingManager.getInstance().startMoving(npc, getRoute(npc));
+			}
+			else
+			{
+				_spawned[getSpawnGroup(npc)]--;
+				SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
+				npc.scheduleDespawn(100);
+				if (_spawned[3] < SPAWNS[3][5])
+				{
+					addSpawn(SPAWNS[3][0], SPAWNS[3][1], SPAWNS[3][2], SPAWNS[3][3], SPAWNS[3][4], false, 0, false);
+				}
+			}
+		}
+		
+		else if (getSpawnGroup(npc) == 3)
+		{
+			if (!npc.isTeleporting())
+			{
+				WalkingManager.getInstance().startMoving(npc, getRoute(npc));
+			}
+			else
+			{
+				// Announcements.getInstance().announceToAll("Greater spawn is added");
+				startQuestTimer("make_spawn_2", respawnTime * 2, null, null);
+				_spawned[3]--;
+				SpawnTable.getInstance().deleteSpawn(npc.getSpawn(), false);
+				npc.scheduleDespawn(100);
+			}
+		}
+		
+		else if ((getSpawnGroup(npc) == 4) && !npc.isTeleporting())
+		{
+			WalkingManager.getInstance().startMoving(npc, getRoute(npc));
+		}
+		
+		return super.onSpawn(npc);
+	}
+	
+	private static int getSpawnGroup(L2Npc npc)
+	{
+		final int coordX = npc.getSpawn().getLocx();
+		final int coordY = npc.getSpawn().getLocy();
+		final int npcId = npc.getNpcId();
+		
+		for (int i = 0; i < 5; i++)
+		{
+			if ((SPAWNS[i][0] == npcId) && (SPAWNS[i][1] == coordX) && (SPAWNS[i][2] == coordY))
+			{
+				return i;
+			}
+		}
+		return -1;
+	}
+	
+	private static int getRoute(L2Npc npc)
+	{
+		final int ret = getSpawnGroup(npc);
+		
+		return ret >= 0 ? ret + 6 : -1;
+	}
+	
+	private static void requestHelp(L2Npc requester, L2PcInstance agressor, int range)
+	{
+		for (L2Spawn npcSpawn : SpawnTable.getInstance().getSpawnTable())
+		{
+			if ((npcSpawn.getNpcid() == FOREMAN) || (npcSpawn.getNpcid() == LESSER_EVIL) || (npcSpawn.getNpcid() == GREATER_EVIL))
+			{
+				final L2MonsterInstance monster = (L2MonsterInstance) npcSpawn.getLastSpawn();
+				
+				if ((monster != null) && !monster.isDead() && monster.isInsideRadius(requester, range, true, false) && (agressor != null) && !agressor.isDead())
+				{
+					monster.addDamageHate(agressor, 0, 1000);
+				}
+			}
+		}
+	}
+	
+	public static void main(String[] args)
+	{
+		new AnomicFoundry(-1, AnomicFoundry.class.getSimpleName(), "hellbound");
+	}
+}

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/BaseTower/32301-01.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Kendal:<br>
+(It feels creepy for some reason.)
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/BaseTower/32301-02.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Kendal:<br>
+It was really horrible. They were tortured, abused, killed. That's how it was. Beleth is evil, and so is Darion. Hmph. Go teach them a lesson!<br>
+</body></html>

+ 124 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/BaseTower/BaseTower.java

@@ -0,0 +1,124 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 hellbound.BaseTower;
+
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import com.l2jserver.gameserver.datatables.DoorTable;
+import com.l2jserver.gameserver.model.L2Effect;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.skills.SkillHolder;
+
+/**
+ * @author GKR
+ */
+public class BaseTower extends Quest
+{
+	private static final int GUZEN = 22362;
+	private static final int KENDAL = 32301;
+	private static final int BODY_DESTROYER = 22363;
+	
+	private static final Map<Integer, L2PcInstance> BODY_DESTROYER_TARGET_LIST = new FastMap<Integer, L2PcInstance>();
+	
+	private static final SkillHolder DEATH_WORD = new SkillHolder(5256, 1);
+	
+	public BaseTower(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		
+		addKillId(GUZEN);
+		addKillId(BODY_DESTROYER);
+		addFirstTalkId(KENDAL);
+		addAggroRangeEnterId(BODY_DESTROYER);
+	}
+	
+	@Override
+	public final String onFirstTalk(L2Npc npc, L2PcInstance player)
+	{
+		ClassId classId = player.getClassId();
+		if (classId.equalsOrChildOf(ClassId.hellKnight) || classId.equalsOrChildOf(ClassId.soultaker))
+		{
+			return "32301-02.htm";
+		}
+		else
+		{
+			return "32301-01.htm";
+		}
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equalsIgnoreCase("close"))
+		{
+			DoorTable.getInstance().getDoor(20260004).closeMe();
+		}
+		return null;
+	}
+	
+	@Override
+	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
+	{
+		if (!BODY_DESTROYER_TARGET_LIST.containsKey(npc.getObjectId()))
+		{
+			BODY_DESTROYER_TARGET_LIST.put(npc.getObjectId(), player);
+			npc.setTarget(player);
+			npc.doSimultaneousCast(DEATH_WORD.getSkill());
+		}
+		return super.onAggroRangeEnter(npc, player, isPet);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
+	{
+		switch (npc.getNpcId())
+		{
+			case GUZEN:
+				// Should Kendal be despawned before Guzen's spawn? Or it will be crowd of Kendal's
+				addSpawn(KENDAL, npc.getSpawn().getLocx(), npc.getSpawn().getLocy(), npc.getSpawn().getLocz(), 0, false, npc.getSpawn().getRespawnDelay(), false);
+				DoorTable.getInstance().getDoor(20260003).openMe();
+				DoorTable.getInstance().getDoor(20260004).openMe();
+				startQuestTimer("close", 60000, npc, null, false);
+				break;
+			case BODY_DESTROYER:
+				if (BODY_DESTROYER_TARGET_LIST.containsKey(npc.getObjectId()))
+				{
+					final L2PcInstance pl = BODY_DESTROYER_TARGET_LIST.get(npc.getObjectId());
+					if ((pl != null) && pl.isOnline() && !pl.isDead())
+					{
+						final L2Effect e = pl.getFirstEffect(DEATH_WORD.getSkill());
+						if (e != null)
+						{
+							e.exit();
+						}
+					}
+					
+					BODY_DESTROYER_TARGET_LIST.remove(npc.getObjectId());
+				}
+		}
+		
+		return super.onKill(npc, killer, isPet);
+	}
+	
+	public static void main(String[] args)
+	{
+		new BaseTower(-1, BaseTower.class.getSimpleName(), "hellbound");
+	}
+}

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Who are you? You must be from the mainland. Your people have already taken from us all there is to take. Return to your own kind and let us be!<br>
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01a.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+He must be from our island. He looks unusually fit and strong. 
+</body></html>

+ 9 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01c.htm

@@ -0,0 +1,9 @@
+<html><head>
+<body>
+Bernarde:<br>
+He must be from our island -- he has a robust complexion that I haven't seen anywhere else! Rumor has it that the Demons are invading the natives' 
+village and laying it to waste. They even seem to have plundered those treasures that the natives cherish most. I would be most grateful if you could 
+secure those treasures and bring them to me. Of course, I must also ask you to finish the work being done at the Ancient Temple Remnants.<br>
+<a action="bypass -h Quest Bernarde 32300-02a.htm">Ask about the work at the Ancient Temple Remnants.</a><br>
+<a action="bypass -h Quest Bernarde Treasure">Turn over the native treasures.</a></body>
+</html>

+ 9 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01d.htm

@@ -0,0 +1,9 @@
+<html><head>
+<body>
+Bernarde:<br>
+He must be from our island -- he has a robust complexion that I haven't seen anywhere else! I have news from those who have visited the 
+Ancient Temple Remnants. They say that the soul of Derek, the First Generation Seer, wanders that place. I do not know the truth of these tales, 
+but I believe those who told them to me are credible witnesses. Will you go and investigate the Ancient Temple Remnants? If you encounter Derek, 
+please help him enter Nirvana.<br>
+<a action="bypass -h Quest Bernarde 32300-02a.htm">Ask about the work at the Ancient Temple Remnants.</a>
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-01f.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Ah, well met, my friend! My thanks for helping Derek's soul enter Nirvana at last. The natives in the village have received his guardianship.
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Bernarde:<br>
+He must be from our island. He looks unusually fit and strong. <br>
+<a action="bypass -h Quest Bernarde 32300-02a.htm">Ask if he needs help.</a>
+</body></html>

+ 9 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02a.htm

@@ -0,0 +1,9 @@
+<html><head>
+<body>
+Bernarde:<br>
+I have a favor to ask of you. You are aware, are you not, that my ancestors in the Ancient Temple Remnants are not at peace? It is a great tragedy... 
+However, you can give them the rest they deserve by spraying this holy water. Are your ancestors there, too? Take this holy water, I beg you, 
+to the ruins and use it to lay the spirits of the seers to rest. There are so many foreigners here these days that it has been difficult to find someone 
+willing to take on this mission...<br>
+<a action="bypass -h Quest Bernarde HolyWater">Exchange 5 Darion's Badges for the holy water.</a>
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02b.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Here it is. Now, please help our ancestors rest in peace!
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02c.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+I am afraid that you do not have a sufficient number of Darion's Badges.
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02d.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Thank you! This treasure will be a huge help to the natives.
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-02e.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Eh, where is the treasure?
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-03.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Bernarde:<br>
+It's been some time since I've seen you, my friend. How have you been?<br>
+<a action="bypass -h Quest Bernarde rumors">Ask about the rumor that has been circulating.</a><br>
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-10r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Darion's minions are likely still numerous within the Steel Citadel, making our path even more difficult. We must find a way to decrease their numbers!
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-11r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+Now we must defeat both Beleth and Darion, and in doing so bring peace to Hellbound...
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-1r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+I have nothing to say. Away with you!
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-2r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+I've said enough; now I must return to my duty. Please help bring rest to those ancestors of mine who are forced to roam the ruins of the ancient temple.
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-3r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Bernarde:<br>
+The Resistance Village is often attacked by Demons who have begun to sense the power of the Resistance and the continent's inhabitants. Be careful!
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-4r.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Bernarde:<br>
+Apparently Derek, the first priest, appears from time to time in the ruins of the ancient temple. How tragic that his spirit still wanders there, 
+unable to rest! Unless he can, I fear there will never be peace between the temple and the native village...
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-5r.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Bernarde:<br>
+They say that the caravan slaves are being forced to work at the quarry. If you can rescue them, the caravan may become more willing to ally with the 
+natives. Please help us by freeing the caravan slaves!
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-6r.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Bernarde:<br>
+Demons have been very active in the Enchanted Megaliths lately. There must be something going on for them to only increase security in that area. 
+Would you investigate? Perhaps you will find something that will help us reduce Beleth's power.
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-7r.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>Bernarde:<br>
+I've learned why the Scarred Plateau was abandoned, why even the money-hungry caravans fear to go there. Perhaps, once you've fully prepared yourself, 
+you'd care to investigate for yourself? It is said that you can use a Magic Bottle to capture Magic Spirits from the monsters there, 
+which in turn are very valuable to magicians overseas. Why not try it?
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-8r.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Bernarde:<br>
+I've heard that that the Resistance and the mainlanders have pushed the Devils all the way back to the Steel Citadel's outer gates! 
+Breaching the gates is now just a matter of time. True, one of the enemy's captains has made a stand before gates, but the combined strength of our 
+forces should be enough to defeat even him!
+</body></html>

+ 7 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/32300-9r.htm

@@ -0,0 +1,7 @@
+<html><head>
+<body>
+Bernarde:<br>
+I hear that the mainlanders and the Resistance have advanced deep into the heart of the Steel Citadel. Oh, that this accursed land might finally see the 
+dawning of a new era! I could cry tears of joy just thinking about it! But we cannot celebrate just yet -- we must still go to the aid of our brethren in 
+the castle.
+</body></html>

+ 114 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Bernarde/Bernarde.java

@@ -0,0 +1,114 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 hellbound.Bernarde;
+
+import com.l2jserver.gameserver.instancemanager.HellboundManager;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
+
+/**
+ * @author DS
+ */
+public class Bernarde extends Quest
+{
+	private static final int BERNARDE = 32300;
+	private static final int NATIVE_TRANSFORM = 101;
+	private static final int HOLY_WATER = 9673;
+	private static final int DARION_BADGE = 9674;
+	private static final int TREASURE = 9684;
+	
+	private static final boolean isTransformed(L2PcInstance player)
+	{
+		return player.isTransformed() && (player.getTransformation().getId() == NATIVE_TRANSFORM);
+	}
+	
+	@Override
+	public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if ("HolyWater".equalsIgnoreCase(event))
+		{
+			if (HellboundManager.getInstance().getLevel() == 2)
+			{
+				if (player.getInventory().getInventoryItemCount(DARION_BADGE, -1, false) >= 5)
+				{
+					if (player.destroyItemByItemId("Quest", DARION_BADGE, 5, npc, true))
+					{
+						player.addItem("Quest", HOLY_WATER, 1, npc, true);
+						return "32300-02b.htm";
+					}
+				}
+			}
+			event = "32300-02c.htm";
+		}
+		else if ("Treasure".equalsIgnoreCase(event))
+		{
+			if (HellboundManager.getInstance().getLevel() == 3)
+			{
+				if (player.getInventory().getInventoryItemCount(TREASURE, -1, false) > 0)
+				{
+					if (player.destroyItemByItemId("Quest", TREASURE, player.getInventory().getInventoryItemCount(TREASURE, -1, false), npc, true))
+					{
+						HellboundManager.getInstance().updateTrust((int) (player.getInventory().getInventoryItemCount(TREASURE, -1, false) * 1000), true);
+						return "32300-02d.htm";
+					}
+				}
+			}
+			event = "32300-02e.htm";
+		}
+		else if ("rumors".equalsIgnoreCase(event))
+		{
+			event = "32300-" + HellboundManager.getInstance().getLevel() + "r.htm";
+		}
+		return event;
+	}
+	
+	@Override
+	public final String onFirstTalk(L2Npc npc, L2PcInstance player)
+	{
+		if (player.getQuestState(getName()) == null)
+		{
+			newQuestState(player);
+		}
+		
+		switch (HellboundManager.getInstance().getLevel())
+		{
+			case 0:
+			case 1:
+				return isTransformed(player) ? "32300-01a.htm" : "32300-01.htm";
+			case 2:
+				return isTransformed(player) ? "32300-02.htm" : "32300-03.htm";
+			case 3:
+				return isTransformed(player) ? "32300-01c.htm" : "32300-03.htm";
+			case 4:
+				return isTransformed(player) ? "32300-01d.htm" : "32300-03.htm";
+			default:
+				return isTransformed(player) ? "32300-01f.htm" : "32300-03.htm";
+		}
+	}
+	
+	public Bernarde(int questId, String name, String descr)
+	{
+		super(questId, name, descr);
+		addFirstTalkId(BERNARDE);
+		addStartNpc(BERNARDE);
+		addTalkId(BERNARDE);
+	}
+	
+	public static void main(String[] args)
+	{
+		new Bernarde(-1, Bernarde.class.getSimpleName(), "hellbound");
+	}
+}

+ 6 - 2
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Budenka/Budenka.java

@@ -28,9 +28,13 @@ public class Budenka extends Quest
 	public final String onFirstTalk(L2Npc npc, L2PcInstance player)
 	{
 		if (player.getInventory().getInventoryItemCount(PREMIUM_CERT, -1, false) > 0)
+		{
 			return "32294-premium.htm";
+		}
 		if (player.getInventory().getInventoryItemCount(STANDART_CERT, -1, false) > 0)
+		{
 			return "32294-standart.htm";
+		}
 		
 		npc.showChatWindow(player);
 		return null;
@@ -44,6 +48,6 @@ public class Budenka extends Quest
 	
 	public static void main(String[] args)
 	{
-		new Budenka(-1, Budenka.class.getSimpleName(), "hellbound");
+		new Budenka(-1, "Budenka", "hellbound");
 	}
-}
+}

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-01.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Buron:<br>
+Ah, you have come from the continent! Have you seen my little brother? <br>
+<a action="bypass -h Quest Buron Rumor">Ask about the rumor.</a>
+</body></html>

+ 11 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-01a.htm

@@ -0,0 +1,11 @@
+<html><head>
+<body>
+Buron:<br>
+Finally, we have regained our home! Please give my regards to Jirrone, who left the island some time ago.<br>
+There is obviously a great deal of work for me to do now that we have regained our village, but I will gladly create native clothes for you whenever you 
+wish it.<br>
+<a action="bypass -h Quest Buron Helmet">Craft Native Helmet.</a><br>
+<a action="bypass -h Quest Buron Tunic">Craft Native Tunic.</a><br>
+<a action="bypass -h Quest Buron Pants">Craft Native Pants.</a><br>
+<a action="bypass -h Quest Buron Rumor">Ask about the rumor.</a>
+</body></html>

+ 10 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-02.htm

@@ -0,0 +1,10 @@
+<html><head>
+<body>
+Buron:<br>
+Ah, now I can trust you! If you give me 10 Darion's Badges, I will make you some of our clothes as a token of my appreciation. 
+Wear them here and the people of the village will welcome you. <br>
+<a action="bypass -h Quest Buron Helmet">Craft Native Helmet.</a><br>
+<a action="bypass -h Quest Buron Tunic">Craft Native Tunic.</a><br>
+<a action="bypass -h Quest Buron Pants">Craft Native Pants.</a><br>
+<a action="bypass -h Quest Buron Rumor">Ask about the rumor.</a>
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-10r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Buron:<br>
+The Steel Citadel is filled with monsters, which must be cleared level by level. To conquer the Steel Citadel, destroy them all!
+</body></html>

+ 5 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-11r.htm

@@ -0,0 +1,5 @@
+<html><head>
+<body>
+Buron:<br>
+Now all that remains is to defeat Darion and Beleth and restore peace to Hellbound.
+</body></html>

+ 6 - 0
L2J_DataPack_BETA/dist/game/data/scripts/hellbound/Buron/32345-1r.htm

@@ -0,0 +1,6 @@
+<html><head>
+<body>
+Buron:<br>
+Perhaps it is a result of the seal being broken, but now we occasionally encounter a few adventurers from the mainland. You may also meet some of our 
+brethren who have been led astray by Darion's minions. Please rescue them!
+</body></html>

Some files were not shown because too many files changed in this diff