Valakas.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package ai.individual;
  16. import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW;
  17. import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE;
  18. import java.util.Collection;
  19. import javolution.util.FastList;
  20. import ai.group_template.L2AttackableAIScript;
  21. import com.l2jserver.Config;
  22. import com.l2jserver.gameserver.ThreadPoolManager;
  23. import com.l2jserver.gameserver.datatables.SkillTable;
  24. import com.l2jserver.gameserver.instancemanager.GrandBossManager;
  25. import com.l2jserver.gameserver.model.L2Effect;
  26. import com.l2jserver.gameserver.model.L2Object;
  27. import com.l2jserver.gameserver.model.L2Skill;
  28. import com.l2jserver.gameserver.model.actor.L2Character;
  29. import com.l2jserver.gameserver.model.actor.L2Npc;
  30. import com.l2jserver.gameserver.model.actor.L2Summon;
  31. import com.l2jserver.gameserver.model.actor.instance.L2DecoyInstance;
  32. import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
  33. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  34. import com.l2jserver.gameserver.model.quest.QuestTimer;
  35. import com.l2jserver.gameserver.model.zone.type.L2BossZone;
  36. import com.l2jserver.gameserver.network.serverpackets.PlaySound;
  37. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  38. import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
  39. import com.l2jserver.gameserver.templates.StatsSet;
  40. import com.l2jserver.gameserver.util.Util;
  41. import com.l2jserver.util.Rnd;
  42. /**
  43. * Valakas AI
  44. *
  45. * @author Kerberos
  46. */
  47. public class Valakas extends L2AttackableAIScript
  48. {
  49. private int i_ai0 = 0;
  50. private int i_ai1 = 0;
  51. private int i_ai2 = 0;
  52. private int i_ai3 = 0;
  53. private int i_ai4 = 0;
  54. private int i_quest0 = 0;
  55. private long i_quest1 = 0; // time to tracking valakas when was last time attacked
  56. private int i_quest2 = 0; // hate value for 1st player
  57. private int i_quest3 = 0; // hate value for 2nd player
  58. private int i_quest4 = 0; // hate value for 3rd player
  59. private L2Character c_quest2 = null; // 1st most hated target
  60. private L2Character c_quest3 = null; // 2nd most hated target
  61. private L2Character c_quest4 = null; // 3rd most hated target
  62. private static final int VALAKAS = 29028;
  63. //Valakas Status Tracking :
  64. private static final byte DORMANT = 0; //Valakas is spawned and no one has entered yet. Entry is unlocked
  65. private static final byte WAITING = 1; //Valakas is spawend and someone has entered, triggering a 30 minute window for additional people to enter
  66. //before he unleashes his attack. Entry is unlocked
  67. private static final byte FIGHTING = 2; //Valakas is engaged in battle, annihilating his foes. Entry is locked
  68. private static final byte DEAD = 3; //Valakas has been killed. Entry is locked
  69. private static L2BossZone _Zone;
  70. // Boss: Valakas
  71. public Valakas(int id, String name, String descr)
  72. {
  73. super(id, name, descr);
  74. int[] mob =
  75. {
  76. VALAKAS
  77. };
  78. this.registerMobs(mob);
  79. i_ai0 = 0;
  80. i_ai1 = 0;
  81. i_ai2 = 0;
  82. i_ai3 = 0;
  83. i_ai4 = 0;
  84. i_quest0 = 0;
  85. i_quest1 = System.currentTimeMillis();
  86. _Zone = GrandBossManager.getInstance().getZone(212852, -114842, -1632);
  87. StatsSet info = GrandBossManager.getInstance().getStatsSet(VALAKAS);
  88. int status = GrandBossManager.getInstance().getBossStatus(VALAKAS);
  89. if (status == DEAD)
  90. {
  91. // load the unlock date and time for valakas from DB
  92. long temp = (info.getLong("respawn_time") - System.currentTimeMillis());
  93. // if valakas is locked until a certain time, mark it so and start the unlock timer
  94. // the unlock time has not yet expired. Mark valakas as currently locked. Setup a timer
  95. // to fire at the correct time (calculate the time between now and the unlock time,
  96. // setup a timer to fire after that many msec)
  97. if (temp > 0)
  98. {
  99. this.startQuestTimer("valakas_unlock", temp, null, null);
  100. }
  101. else
  102. {
  103. // the time has already expired while the server was offline. Immediately spawn valakas in his cave.
  104. // also, the status needs to be changed to DORMANT
  105. L2GrandBossInstance valakas = (L2GrandBossInstance) addSpawn(VALAKAS, -105200, -253104, -15264, 0, false, 0);
  106. GrandBossManager.getInstance().setBossStatus(VALAKAS, DORMANT);
  107. GrandBossManager.getInstance().addBoss(valakas);
  108. final L2Npc _valakas = valakas;
  109. ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
  110. {
  111. public void run()
  112. {
  113. try
  114. {
  115. _valakas.setIsInvul(true);
  116. _valakas.setRunning();
  117. }
  118. catch (Throwable e)
  119. {}
  120. }
  121. }, 100L);
  122. startQuestTimer("1003", 60000, valakas, null, true);
  123. }
  124. }
  125. else
  126. {
  127. int loc_x = info.getInteger("loc_x");
  128. int loc_y = info.getInteger("loc_y");
  129. int loc_z = info.getInteger("loc_z");
  130. int heading = info.getInteger("heading");
  131. final int hp = info.getInteger("currentHP");
  132. final int mp = info.getInteger("currentMP");
  133. L2GrandBossInstance valakas = (L2GrandBossInstance) addSpawn(VALAKAS, loc_x, loc_y, loc_z, heading, false, 0);
  134. GrandBossManager.getInstance().addBoss(valakas);
  135. final L2Npc _valakas = valakas;
  136. final int _status = status;
  137. ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
  138. {
  139. public void run()
  140. {
  141. try
  142. {
  143. _valakas.setCurrentHpMp(hp, mp);
  144. if (_status != FIGHTING)
  145. _valakas.setIsInvul(true);
  146. _valakas.setRunning();
  147. }
  148. catch (Throwable e)
  149. {}
  150. }
  151. }, 100L);
  152. startQuestTimer("1003", 60000, valakas, null, true);
  153. if (status == WAITING)
  154. {
  155. // Start timer to lock entry after 30 minutes
  156. startQuestTimer("1001", Config.Valakas_Wait_Time, valakas, null);
  157. }
  158. else if (status == FIGHTING)
  159. {
  160. // Start repeating timer to check for inactivity
  161. startQuestTimer("1002", 60000, valakas, null, true);
  162. valakas.setIsInvul(false);
  163. }
  164. }
  165. }
  166. @Override
  167. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  168. {
  169. if (npc != null)
  170. {
  171. long temp = 0;
  172. if (event.equalsIgnoreCase("1001"))
  173. {
  174. npc.teleToLocation(212852, -114842, -1632);
  175. i_quest1 = System.currentTimeMillis();
  176. final L2Npc _valakas = npc;
  177. ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
  178. {
  179. public void run()
  180. {
  181. try
  182. {
  183. broadcastSpawn(_valakas);
  184. }
  185. catch (Throwable e)
  186. {}
  187. }
  188. }, 1L);
  189. startQuestTimer("1004", 2000, npc, null);
  190. }
  191. else if (event.equalsIgnoreCase("1002"))
  192. {
  193. int lvl = 0;
  194. int sk_4691 = 0;
  195. L2Effect[] effects = npc.getAllEffects();
  196. if (effects != null && effects.length != 0)
  197. {
  198. for (L2Effect e : effects)
  199. {
  200. if (e.getSkill().getId() == 4629)
  201. {
  202. sk_4691 = 1;
  203. lvl = e.getSkill().getLevel();
  204. break;
  205. }
  206. }
  207. }
  208. if (GrandBossManager.getInstance().getBossStatus(VALAKAS) == FIGHTING)
  209. {
  210. temp = (System.currentTimeMillis() - i_quest1);
  211. if (temp > 900000)
  212. {
  213. npc.getAI().setIntention(AI_INTENTION_IDLE);
  214. npc.teleToLocation(-105200, -253104, -15264);
  215. GrandBossManager.getInstance().setBossStatus(VALAKAS, DORMANT);
  216. npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
  217. _Zone.oustAllPlayers();
  218. cancelQuestTimer("1002", npc, null);
  219. i_quest2 = 0;
  220. i_quest3 = 0;
  221. i_quest4 = 0;
  222. }
  223. }
  224. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 1) / 4))
  225. {
  226. if (sk_4691 == 0 || (sk_4691 == 1 && lvl != 4))
  227. {
  228. npc.setTarget(npc);
  229. npc.doCast(SkillTable.getInstance().getInfo(4691, 4));
  230. }
  231. }
  232. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 2) / 4.0))
  233. {
  234. if (sk_4691 == 0 || (sk_4691 == 1 && lvl != 3))
  235. {
  236. npc.setTarget(npc);
  237. npc.doCast(SkillTable.getInstance().getInfo(4691, 3));
  238. }
  239. }
  240. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 3) / 4.0))
  241. {
  242. if (sk_4691 == 0 || (sk_4691 == 1 && lvl != 2))
  243. {
  244. npc.setTarget(npc);
  245. npc.doCast(SkillTable.getInstance().getInfo(4691, 2));
  246. }
  247. }
  248. else if (sk_4691 == 0 || (sk_4691 == 1 && lvl != 1))
  249. {
  250. npc.setTarget(npc);
  251. npc.doCast(SkillTable.getInstance().getInfo(4691, 1));
  252. }
  253. }
  254. else if (event.equalsIgnoreCase("1003"))
  255. {
  256. if (!npc.isInvul())
  257. getRandomSkill(npc);
  258. else
  259. npc.getAI().setIntention(AI_INTENTION_IDLE);
  260. }
  261. else if (event.equalsIgnoreCase("1004"))
  262. {
  263. startQuestTimer("1102", 1500, npc, null);
  264. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1300,180,-5,3000,15000,0,-5,1,0));
  265. }
  266. else if (event.equalsIgnoreCase("1102"))
  267. {
  268. startQuestTimer("1103", 3300, npc, null);
  269. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),500,180,-8,600,15000,0,60,1,0));
  270. }
  271. else if (event.equalsIgnoreCase("1103"))
  272. {
  273. startQuestTimer("1104", 2900, npc, null);
  274. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),800,180,-8,2700,15000,0,30,1,0));
  275. }
  276. else if (event.equalsIgnoreCase("1104"))
  277. {
  278. startQuestTimer("1105", 2700, npc, null);
  279. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),200,250,70,0,15000,30,80,1,0));
  280. }
  281. else if (event.equalsIgnoreCase("1105"))
  282. {
  283. startQuestTimer("1106", 1, npc, null);
  284. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1100,250,70,2500,15000,30,80,1,0));
  285. }
  286. else if (event.equalsIgnoreCase("1106"))
  287. {
  288. startQuestTimer("1107", 3200, npc, null);
  289. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),700,150,30,0,15000,-10,60,1,0));
  290. }
  291. else if (event.equalsIgnoreCase("1107"))
  292. {
  293. startQuestTimer("1108", 1400, npc, null);
  294. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1200,150,20,2900,15000,-10,30,1,0));
  295. }
  296. else if (event.equalsIgnoreCase("1108"))
  297. {
  298. startQuestTimer("1109", 6700, npc, null);
  299. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),750,170,15,3400,15000,10,-15,1,0));
  300. }
  301. else if (event.equalsIgnoreCase("1109"))
  302. {
  303. startQuestTimer("1110", 5700, npc, null);
  304. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),750,170,-10,3400,15000,4000,-15,1,0));
  305. }
  306. else if (event.equalsIgnoreCase("1110"))
  307. {
  308. GrandBossManager.getInstance().setBossStatus(VALAKAS,FIGHTING);
  309. startQuestTimer("1002", 60000, npc, null, true);
  310. npc.setIsInvul(false);
  311. getRandomSkill(npc);
  312. }
  313. else if (event.equalsIgnoreCase("1111"))
  314. {
  315. startQuestTimer("1112", 3500, npc, null);
  316. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1100,210,-5,3000,10000,-13,0,1,1));
  317. }
  318. else if (event.equalsIgnoreCase("1112"))
  319. {
  320. startQuestTimer("1113", 4500, npc, null);
  321. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1300,200,-8,3000,10000,0,15,1,1));
  322. }
  323. else if (event.equalsIgnoreCase("1113"))
  324. {
  325. startQuestTimer("1114", 500, npc, null);
  326. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1000,190,0,3000,10000,0,10,1,1));
  327. }
  328. else if (event.equalsIgnoreCase("1114"))
  329. {
  330. startQuestTimer("1115", 4600, npc, null);
  331. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1700,120,0,2500,10000,12,40,1,1));
  332. }
  333. else if (event.equalsIgnoreCase("1115"))
  334. {
  335. startQuestTimer("1116", 750, npc, null);
  336. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1700,20,0,3000,10000,10,10,1,1));
  337. }
  338. else if (event.equalsIgnoreCase("1116"))
  339. {
  340. startQuestTimer("1117", 2500, npc, null);
  341. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1700,10,0,3000,10000,20,70,1,1));
  342. }
  343. else if (event.equalsIgnoreCase("1117"))
  344. {
  345. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1700,10,0,3000,250,20,-20,1,1));
  346. addSpawn(31759, 212852, -114842, -1632, 0, false, 900000);
  347. int radius = 1500;
  348. for (int i = 0; i < 20; i++)
  349. {
  350. int x = (int) (radius * Math.cos(i * .331)); //.331~2pi/19
  351. int y = (int) (radius * Math.sin(i * .331));
  352. addSpawn(31759, 212852 + x, -114842 + y, -1632, 0, false, 900000);
  353. }
  354. cancelQuestTimer("1002", npc, null);
  355. startQuestTimer("remove_players", 900000, null, null);
  356. }
  357. }
  358. else
  359. {
  360. if (event.equalsIgnoreCase("valakas_unlock"))
  361. {
  362. L2GrandBossInstance valakas = (L2GrandBossInstance) addSpawn(VALAKAS, -105200, -253104, -15264, 32768, false, 0);
  363. GrandBossManager.getInstance().addBoss(valakas);
  364. GrandBossManager.getInstance().setBossStatus(VALAKAS, DORMANT);
  365. }
  366. else if (event.equalsIgnoreCase("remove_players"))
  367. {
  368. _Zone.oustAllPlayers();
  369. }
  370. }
  371. return super.onAdvEvent(event, npc, player);
  372. }
  373. @Override
  374. public String onSpawn(L2Npc npc)
  375. {
  376. npc.disableCoreAI(true);
  377. return super.onSpawn(npc);
  378. }
  379. @Override
  380. public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet, L2Skill skill)
  381. {
  382. if (npc.isInvul())
  383. {
  384. return null;
  385. }
  386. i_quest1 = System.currentTimeMillis();
  387. if (GrandBossManager.getInstance().getBossStatus(VALAKAS) != FIGHTING)
  388. {
  389. attacker.teleToLocation(150037, -57255, -2976);
  390. }
  391. if (attacker.getMountType() == 1)
  392. {
  393. int sk_4258 = 0;
  394. L2Effect[] effects = attacker.getAllEffects();
  395. if (effects != null && effects.length != 0)
  396. {
  397. for (L2Effect e : effects)
  398. {
  399. if (e.getSkill().getId() == 4258)
  400. {
  401. sk_4258 = 1;
  402. }
  403. }
  404. }
  405. if (sk_4258 == 0)
  406. {
  407. npc.setTarget(attacker);
  408. npc.doCast(SkillTable.getInstance().getInfo(4258, 1));
  409. }
  410. }
  411. if (attacker.getZ() < (npc.getZ() + 200))
  412. {
  413. if (i_ai2 == 0)
  414. {
  415. i_ai1 = (i_ai1 + damage);
  416. }
  417. if (i_quest0 == 0)
  418. {
  419. i_ai4 = (i_ai4 + damage);
  420. }
  421. if (i_quest0 == 0)
  422. {
  423. i_ai3 = (i_ai3 + damage);
  424. }
  425. else if (i_ai2 == 0)
  426. {
  427. i_ai0 = (i_ai0 + damage);
  428. }
  429. if (i_quest0 == 0)
  430. {
  431. if ((((i_ai4 / npc.getMaxHp()) * 100)) > 1)
  432. {
  433. if (i_ai3 > (i_ai4 - i_ai3))
  434. {
  435. i_ai3 = 0;
  436. i_ai4 = 0;
  437. npc.setTarget(npc);
  438. npc.doCast(SkillTable.getInstance().getInfo(4687, 1));
  439. i_quest0 = 1;
  440. }
  441. }
  442. }
  443. }
  444. int i1 = 0;
  445. if (skill == null)
  446. {
  447. if (attacker == c_quest2)
  448. {
  449. if (((damage * 1000) + 1000) > i_quest2)
  450. {
  451. i_quest2 = ((damage * 1000) + Rnd.get(3000));
  452. }
  453. }
  454. else if (attacker == c_quest3)
  455. {
  456. if (((damage * 1000) + 1000) > i_quest3)
  457. {
  458. i_quest3 = ((damage * 1000) + Rnd.get(3000));
  459. }
  460. }
  461. else if (attacker == c_quest4)
  462. {
  463. if (((damage * 1000) + 1000) > i_quest4)
  464. {
  465. i_quest4 = ((damage * 1000) + Rnd.get(3000));
  466. }
  467. }
  468. else if (i_quest2 > i_quest3)
  469. {
  470. i1 = 3;
  471. }
  472. else if (i_quest2 == i_quest3)
  473. {
  474. if (Rnd.get(100) < 50)
  475. {
  476. i1 = 2;
  477. }
  478. else
  479. {
  480. i1 = 3;
  481. }
  482. }
  483. else if (i_quest2 < i_quest3)
  484. {
  485. i1 = 2;
  486. }
  487. if (i1 == 2)
  488. {
  489. if (i_quest2 > i_quest4)
  490. {
  491. i1 = 4;
  492. }
  493. else if (i_quest2 == i_quest4)
  494. {
  495. if (Rnd.get(100) < 50)
  496. {
  497. i1 = 2;
  498. }
  499. else
  500. {
  501. i1 = 4;
  502. }
  503. }
  504. else if (i_quest2 < i_quest4)
  505. {
  506. i1 = 2;
  507. }
  508. }
  509. else if (i1 == 3)
  510. {
  511. if (i_quest3 > i_quest4)
  512. {
  513. i1 = 4;
  514. }
  515. else if (i_quest3 == i_quest4)
  516. {
  517. if (Rnd.get(100) < 50)
  518. {
  519. i1 = 3;
  520. }
  521. else
  522. {
  523. i1 = 4;
  524. }
  525. }
  526. else if (i_quest3 < i_quest4)
  527. {
  528. i1 = 3;
  529. }
  530. }
  531. if (i1 == 2)
  532. {
  533. i_quest2 = (damage * 1000) + Rnd.get(3000);
  534. c_quest2 = attacker;
  535. }
  536. else if (i1 == 3)
  537. {
  538. i_quest3 = (damage * 1000) + Rnd.get(3000);
  539. c_quest3 = attacker;
  540. }
  541. else if (i1 == 4)
  542. {
  543. i_quest4 = (damage * 1000) + Rnd.get(3000);
  544. c_quest4 = attacker;
  545. }
  546. }
  547. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 1) / 4))
  548. {
  549. if (attacker == c_quest2)
  550. {
  551. if ((((damage / 30) * 1000) + 1000) > i_quest2)
  552. {
  553. i_quest2 = (((damage / 30) * 1000) + Rnd.get(3000));
  554. }
  555. }
  556. else if (attacker == c_quest3)
  557. {
  558. if ((((damage / 30) * 1000) + 1000) > i_quest3)
  559. {
  560. i_quest3 = (((damage / 30) * 1000) + Rnd.get(3000));
  561. }
  562. }
  563. else if (attacker == c_quest4)
  564. {
  565. if ((((damage / 30) * 1000) + 1000) > i_quest4)
  566. {
  567. i_quest4 = (((damage / 30) * 1000) + Rnd.get(3000));
  568. }
  569. }
  570. else if (i_quest2 > i_quest3)
  571. {
  572. i1 = 3;
  573. }
  574. else if (i_quest2 == i_quest3)
  575. {
  576. if (Rnd.get(100) < 50)
  577. {
  578. i1 = 2;
  579. }
  580. else
  581. {
  582. i1 = 3;
  583. }
  584. }
  585. else if (i_quest2 < i_quest3)
  586. {
  587. i1 = 2;
  588. }
  589. if (i1 == 2)
  590. {
  591. if (i_quest2 > i_quest4)
  592. {
  593. i1 = 4;
  594. }
  595. else if (i_quest2 == i_quest4)
  596. {
  597. if (Rnd.get(100) < 50)
  598. {
  599. i1 = 2;
  600. }
  601. else
  602. {
  603. i1 = 4;
  604. }
  605. }
  606. else if (i_quest2 < i_quest4)
  607. {
  608. i1 = 2;
  609. }
  610. }
  611. else if (i1 == 3)
  612. {
  613. if (i_quest3 > i_quest4)
  614. {
  615. i1 = 4;
  616. }
  617. else if (i_quest3 == i_quest4)
  618. {
  619. if (Rnd.get(100) < 50)
  620. {
  621. i1 = 3;
  622. }
  623. else
  624. {
  625. i1 = 4;
  626. }
  627. }
  628. else if (i_quest3 < i_quest4)
  629. {
  630. i1 = 3;
  631. }
  632. }
  633. if (i1 == 2)
  634. {
  635. i_quest2 = (((damage / 30) * 1000) + Rnd.get(3000));
  636. c_quest2 = attacker;
  637. }
  638. else if (i1 == 3)
  639. {
  640. i_quest3 = (((damage / 30) * 1000) + Rnd.get(3000));
  641. c_quest3 = attacker;
  642. }
  643. else if (i1 == 4)
  644. {
  645. i_quest4 = (((damage / 30) * 1000) + Rnd.get(3000));
  646. c_quest4 = attacker;
  647. }
  648. }
  649. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 2) / 4))
  650. {
  651. if (attacker == c_quest2)
  652. {
  653. if ((((damage / 50) * 1000) + 1000) > i_quest2)
  654. {
  655. i_quest2 = (((damage / 50) * 1000) + Rnd.get(3000));
  656. }
  657. }
  658. else if (attacker == c_quest3)
  659. {
  660. if ((((damage / 50) * 1000) + 1000) > i_quest3)
  661. {
  662. i_quest3 = (((damage / 50) * 1000) + Rnd.get(3000));
  663. }
  664. }
  665. else if (attacker == c_quest4)
  666. {
  667. if ((((damage / 50) * 1000) + 1000) > i_quest4)
  668. {
  669. i_quest4 = (((damage / 50) * 1000) + Rnd.get(3000));
  670. }
  671. }
  672. else if (i_quest2 > i_quest3)
  673. {
  674. i1 = 3;
  675. }
  676. else if (i_quest2 == i_quest3)
  677. {
  678. if (Rnd.get(100) < 50)
  679. {
  680. i1 = 2;
  681. }
  682. else
  683. {
  684. i1 = 3;
  685. }
  686. }
  687. else if (i_quest2 < i_quest3)
  688. {
  689. i1 = 2;
  690. }
  691. if (i1 == 2)
  692. {
  693. if (i_quest2 > i_quest4)
  694. {
  695. i1 = 4;
  696. }
  697. else if (i_quest2 == i_quest4)
  698. {
  699. if (Rnd.get(100) < 50)
  700. {
  701. i1 = 2;
  702. }
  703. else
  704. {
  705. i1 = 4;
  706. }
  707. }
  708. else if (i_quest2 < i_quest4)
  709. {
  710. i1 = 2;
  711. }
  712. }
  713. else if (i1 == 3)
  714. {
  715. if (i_quest3 > i_quest4)
  716. {
  717. i1 = 4;
  718. }
  719. else if (i_quest3 == i_quest4)
  720. {
  721. if (Rnd.get(100) < 50)
  722. {
  723. i1 = 3;
  724. }
  725. else
  726. {
  727. i1 = 4;
  728. }
  729. }
  730. else if (i_quest3 < i_quest4)
  731. {
  732. i1 = 3;
  733. }
  734. }
  735. if (i1 == 2)
  736. {
  737. i_quest2 = (((damage / 50) * 1000) + Rnd.get(3000));
  738. c_quest2 = attacker;
  739. }
  740. else if (i1 == 3)
  741. {
  742. i_quest3 = (((damage / 50) * 1000) + Rnd.get(3000));
  743. c_quest3 = attacker;
  744. }
  745. else if (i1 == 4)
  746. {
  747. i_quest4 = (((damage / 50) * 1000) + Rnd.get(3000));
  748. c_quest4 = attacker;
  749. }
  750. }
  751. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 3) / 4.0))
  752. {
  753. if (attacker == c_quest2)
  754. {
  755. if ((((damage / 100) * 1000) + 1000) > i_quest2)
  756. {
  757. i_quest2 = (((damage / 100) * 1000) + Rnd.get(3000));
  758. }
  759. }
  760. else if (attacker == c_quest3)
  761. {
  762. if ((((damage / 100) * 1000) + 1000) > i_quest3)
  763. {
  764. i_quest3 = (((damage / 100) * 1000) + Rnd.get(3000));
  765. }
  766. }
  767. else if (attacker == c_quest4)
  768. {
  769. if ((((damage / 100) * 1000) + 1000) > i_quest4)
  770. {
  771. i_quest4 = (((damage / 100) * 1000) + Rnd.get(3000));
  772. }
  773. }
  774. else if (i_quest2 > i_quest3)
  775. {
  776. i1 = 3;
  777. }
  778. else if (i_quest2 == i_quest3)
  779. {
  780. if (Rnd.get(100) < 50)
  781. {
  782. i1 = 2;
  783. }
  784. else
  785. {
  786. i1 = 3;
  787. }
  788. }
  789. else if (i_quest2 < i_quest3)
  790. {
  791. i1 = 2;
  792. }
  793. if (i1 == 2)
  794. {
  795. if (i_quest2 > i_quest4)
  796. {
  797. i1 = 4;
  798. }
  799. else if (i_quest2 == i_quest4)
  800. {
  801. if (Rnd.get(100) < 50)
  802. {
  803. i1 = 2;
  804. }
  805. else
  806. {
  807. i1 = 4;
  808. }
  809. }
  810. else if (i_quest2 < i_quest4)
  811. {
  812. i1 = 2;
  813. }
  814. }
  815. else if (i1 == 3)
  816. {
  817. if (i_quest3 > i_quest4)
  818. {
  819. i1 = 4;
  820. }
  821. else if (i_quest3 == i_quest4)
  822. {
  823. if (Rnd.get(100) < 50)
  824. {
  825. i1 = 3;
  826. }
  827. else
  828. {
  829. i1 = 4;
  830. }
  831. }
  832. else if (i_quest3 < i_quest4)
  833. {
  834. i1 = 3;
  835. }
  836. if (i1 == 2)
  837. {
  838. i_quest2 = (((damage / 100) * 1000) + Rnd.get(3000));
  839. c_quest2 = attacker;
  840. }
  841. else if (i1 == 3)
  842. {
  843. i_quest3 = (((damage / 100) * 1000) + Rnd.get(3000));
  844. c_quest3 = attacker;
  845. }
  846. else if (i1 == 4)
  847. {
  848. i_quest4 = (((damage / 100) * 1000) + Rnd.get(3000));
  849. c_quest4 = attacker;
  850. }
  851. }
  852. }
  853. else if (attacker == c_quest2)
  854. {
  855. if ((((damage / 150) * 1000) + 1000) > i_quest2)
  856. {
  857. i_quest2 = (((damage / 150) * 1000) + Rnd.get(3000));
  858. }
  859. }
  860. else if (attacker == c_quest3)
  861. {
  862. if ((((damage / 150) * 1000) + 1000) > i_quest3)
  863. {
  864. i_quest3 = (((damage / 150) * 1000) + Rnd.get(3000));
  865. }
  866. }
  867. else if (attacker == c_quest4)
  868. {
  869. if ((((damage / 150) * 1000) + 1000) > i_quest4)
  870. {
  871. i_quest4 = (((damage / 150) * 1000) + Rnd.get(3000));
  872. }
  873. }
  874. else if (i_quest2 > i_quest3)
  875. {
  876. i1 = 3;
  877. }
  878. else if (i_quest2 == i_quest3)
  879. {
  880. if (Rnd.get(100) < 50)
  881. {
  882. i1 = 2;
  883. }
  884. else
  885. {
  886. i1 = 3;
  887. }
  888. }
  889. else if (i_quest2 < i_quest3)
  890. {
  891. i1 = 2;
  892. }
  893. if (i1 == 2)
  894. {
  895. if (i_quest2 > i_quest4)
  896. {
  897. i1 = 4;
  898. }
  899. else if (i_quest2 == i_quest4)
  900. {
  901. if (Rnd.get(100) < 50)
  902. {
  903. i1 = 2;
  904. }
  905. else
  906. {
  907. i1 = 4;
  908. }
  909. }
  910. else if (i_quest2 < i_quest4)
  911. {
  912. i1 = 2;
  913. }
  914. }
  915. else if (i1 == 3)
  916. {
  917. if (i_quest3 > i_quest4)
  918. {
  919. i1 = 4;
  920. }
  921. else if (i_quest3 == i_quest4)
  922. {
  923. if (Rnd.get(100) < 50)
  924. {
  925. i1 = 3;
  926. }
  927. else
  928. {
  929. i1 = 4;
  930. }
  931. }
  932. else if (i_quest3 < i_quest4)
  933. {
  934. i1 = 3;
  935. }
  936. }
  937. if (i1 == 2)
  938. {
  939. i_quest2 = (((damage / 150) * 1000) + Rnd.get(3000));
  940. c_quest2 = attacker;
  941. }
  942. else if (i1 == 3)
  943. {
  944. i_quest3 = (((damage / 150) * 1000) + Rnd.get(3000));
  945. c_quest3 = attacker;
  946. }
  947. else if (i1 == 4)
  948. {
  949. i_quest4 = (((damage / 150) * 1000) + Rnd.get(3000));
  950. c_quest4 = attacker;
  951. }
  952. getRandomSkill(npc);
  953. return super.onAttack(npc, attacker, damage, isPet);
  954. }
  955. @Override
  956. public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
  957. {
  958. startQuestTimer("1111", 500, npc, null);
  959. npc.broadcastPacket(new SpecialCamera(npc.getObjectId(),1700,2000,130,-1,0,10000,-20,1,1));
  960. npc.broadcastPacket(new PlaySound(1, "B03_D", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
  961. GrandBossManager.getInstance().setBossStatus(VALAKAS,DEAD);
  962. long respawnTime = (long) Config.Interval_Of_Valakas_Spawn + Rnd.get(Config.Random_Of_Valakas_Spawn);
  963. this.startQuestTimer("valakas_unlock", respawnTime, null, null);
  964. // also save the respawn time so that the info is maintained past reboots
  965. StatsSet info = GrandBossManager.getInstance().getStatsSet(VALAKAS);
  966. info.set("respawn_time", (System.currentTimeMillis() + respawnTime));
  967. GrandBossManager.getInstance().setStatsSet(VALAKAS, info);
  968. return super.onKill(npc, killer, isPet);
  969. }
  970. public void getRandomSkill(L2Npc npc)
  971. {
  972. if (npc.isInvul() || npc.isCastingNow())
  973. {
  974. return;
  975. }
  976. L2Skill skill = null;
  977. int i0 = 0;
  978. int i1 = 0;
  979. int i2 = 0;
  980. L2Character c2 = null;
  981. if (c_quest2 == null)
  982. i_quest2 = 0;
  983. else if (!Util.checkIfInRange(5000, npc, c_quest2, true) || c_quest2.isDead())
  984. i_quest2 = 0;
  985. if (c_quest3 == null)
  986. i_quest3 = 0;
  987. else if (!Util.checkIfInRange(5000, npc, c_quest3, true) || c_quest3.isDead())
  988. i_quest3 = 0;
  989. if (c_quest4 == null)
  990. i_quest4 = 0;
  991. else if (!Util.checkIfInRange(5000, npc, c_quest4, true) || c_quest4.isDead())
  992. i_quest4 = 0;
  993. if (i_quest2 > i_quest3)
  994. {
  995. i1 = 2;
  996. i2 = i_quest2;
  997. c2 = c_quest2;
  998. }
  999. else
  1000. {
  1001. i1 = 3;
  1002. i2 = i_quest3;
  1003. c2 = c_quest3;
  1004. }
  1005. if (i_quest4 > i2)
  1006. {
  1007. i1 = 4;
  1008. i2 = i_quest4;
  1009. c2 = c_quest4;
  1010. }
  1011. if (i2 == 0)
  1012. c2 = getRandomTarget(npc);
  1013. if (i2 > 0)
  1014. {
  1015. if (Rnd.get(100) < 70)
  1016. {
  1017. if (i1 == 2)
  1018. i_quest2 = 500;
  1019. else if (i1 == 3)
  1020. i_quest3 = 500;
  1021. else if (i1 == 4)
  1022. i_quest4 = 500;
  1023. }
  1024. if (npc.getCurrentHp() > ((npc.getMaxHp() * 1) / 4))
  1025. {
  1026. i0 = 0;
  1027. i1 = 0;
  1028. if (Util.checkIfInRange(1423, npc, c2, true))
  1029. {
  1030. i0 = 1;
  1031. i1 = 1;
  1032. }
  1033. if (c2.getZ() < (npc.getZ() + 200))
  1034. {
  1035. if (Rnd.get(100) < 20)
  1036. {
  1037. skill = SkillTable.getInstance().getInfo(4690, 1);
  1038. }
  1039. else if (Rnd.get(100) < 15)
  1040. {
  1041. skill = SkillTable.getInstance().getInfo(4689, 1);
  1042. }
  1043. else if (Rnd.get(100) < 15 && i0 == 1 && i_quest0 == 1)
  1044. {
  1045. skill = SkillTable.getInstance().getInfo(4685, 1);
  1046. i_quest0 = 0;
  1047. }
  1048. else if (Rnd.get(100) < 10 && i1 == 1)
  1049. {
  1050. skill = SkillTable.getInstance().getInfo(4688, 1);
  1051. }
  1052. else if (Rnd.get(100) < 35)
  1053. {
  1054. skill = SkillTable.getInstance().getInfo(4683, 1);
  1055. }
  1056. else
  1057. {
  1058. if (Rnd.get(2) == 0) // TODO: replace me with direction, to check if player standing on left or right side of valakas
  1059. skill = SkillTable.getInstance().getInfo(4681, 1); // left hand
  1060. else
  1061. skill = SkillTable.getInstance().getInfo(4682, 1); // right hand
  1062. }
  1063. }
  1064. else if (Rnd.get(100) < 20)
  1065. {
  1066. skill = SkillTable.getInstance().getInfo(4690, 1);
  1067. }
  1068. else if (Rnd.get(100) < 15)
  1069. {
  1070. skill = SkillTable.getInstance().getInfo(4689, 1);
  1071. }
  1072. else
  1073. {
  1074. skill = SkillTable.getInstance().getInfo(4684, 1);
  1075. }
  1076. }
  1077. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 2) / 4))
  1078. {
  1079. i0 = 0;
  1080. i1 = 0;
  1081. if (Util.checkIfInRange(1423, npc, c2, true))
  1082. {
  1083. i0 = 1;
  1084. i1 = 1;
  1085. }
  1086. if (c2.getZ() < (npc.getZ() + 200))
  1087. {
  1088. if (Rnd.get(100) < 5)
  1089. {
  1090. skill = SkillTable.getInstance().getInfo(4690, 1);
  1091. }
  1092. else if (Rnd.get(100) < 10)
  1093. {
  1094. skill = SkillTable.getInstance().getInfo(4689, 1);
  1095. }
  1096. else if (Rnd.get(100) < 10 && i0 == 1 && i_quest0 == 1)
  1097. {
  1098. skill = SkillTable.getInstance().getInfo(4685, 1);
  1099. i_quest0 = 0;
  1100. }
  1101. else if (Rnd.get(100) < 10 && i1 == 1)
  1102. {
  1103. skill = SkillTable.getInstance().getInfo(4688, 1);
  1104. }
  1105. else if (Rnd.get(100) < 20)
  1106. {
  1107. skill = SkillTable.getInstance().getInfo(4683, 1);
  1108. }
  1109. else
  1110. {
  1111. if (Rnd.get(2) == 0) // TODO: replace me with direction, to check if player standing on left or right side of valakas
  1112. skill = SkillTable.getInstance().getInfo(4681, 1); // left hand
  1113. else
  1114. skill = SkillTable.getInstance().getInfo(4682, 1); // right hand
  1115. }
  1116. }
  1117. else if (Rnd.get(100) < 5)
  1118. {
  1119. skill = SkillTable.getInstance().getInfo(4690, 1);
  1120. }
  1121. else if (Rnd.get(100) < 10)
  1122. {
  1123. skill = SkillTable.getInstance().getInfo(4689, 1);
  1124. }
  1125. else
  1126. {
  1127. skill = SkillTable.getInstance().getInfo(4684, 1);
  1128. }
  1129. }
  1130. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 3) / 4.0))
  1131. {
  1132. i0 = 0;
  1133. i1 = 0;
  1134. if (Util.checkIfInRange(1423, npc, c2, true))
  1135. {
  1136. i0 = 1;
  1137. i1 = 1;
  1138. }
  1139. if (c2.getZ() < (npc.getZ() + 200))
  1140. {
  1141. if (Rnd.get(100) < 0)
  1142. {
  1143. skill = SkillTable.getInstance().getInfo(4690, 1);
  1144. }
  1145. else if (Rnd.get(100) < 5)
  1146. {
  1147. skill = SkillTable.getInstance().getInfo(4689, 1);
  1148. }
  1149. else if (Rnd.get(100) < 5 && i0 == 1 && i_quest0 == 1)
  1150. {
  1151. skill = SkillTable.getInstance().getInfo(4685, 1);
  1152. i_quest0 = 0;
  1153. }
  1154. else if (Rnd.get(100) < 10 && i1 == 1)
  1155. {
  1156. skill = SkillTable.getInstance().getInfo(4688, 1);
  1157. }
  1158. else if (Rnd.get(100) < 15)
  1159. {
  1160. skill = SkillTable.getInstance().getInfo(4683, 1);
  1161. }
  1162. else
  1163. {
  1164. if (Rnd.get(2) == 0) // TODO: replace me with direction, to check if player standing on left or right side of valakas
  1165. skill = SkillTable.getInstance().getInfo(4681, 1); // left hand
  1166. else
  1167. skill = SkillTable.getInstance().getInfo(4682, 1); // right hand
  1168. }
  1169. }
  1170. else if (Rnd.get(100) < 0)
  1171. {
  1172. skill = SkillTable.getInstance().getInfo(4690, 1);
  1173. }
  1174. else if (Rnd.get(100) < 5)
  1175. {
  1176. skill = SkillTable.getInstance().getInfo(4689, 1);
  1177. }
  1178. else
  1179. {
  1180. skill = SkillTable.getInstance().getInfo(4684, 1);
  1181. }
  1182. }
  1183. else
  1184. {
  1185. i0 = 0;
  1186. i1 = 0;
  1187. if (Util.checkIfInRange(1423, npc, c2, true))
  1188. {
  1189. i0 = 1;
  1190. i1 = 1;
  1191. }
  1192. if (c2.getZ() < (npc.getZ() + 200))
  1193. {
  1194. if (Rnd.get(100) < 0)
  1195. {
  1196. skill = SkillTable.getInstance().getInfo(4690, 1);
  1197. }
  1198. else if (Rnd.get(100) < 10)
  1199. {
  1200. skill = SkillTable.getInstance().getInfo(4689, 1);
  1201. }
  1202. else if (Rnd.get(100) < 5 && i0 == 1 && i_quest0 == 1)
  1203. {
  1204. skill = SkillTable.getInstance().getInfo(4685, 1);
  1205. i_quest0 = 0;
  1206. }
  1207. else if (Rnd.get(100) < 10 && i1 == 1)
  1208. {
  1209. skill = SkillTable.getInstance().getInfo(4688, 1);
  1210. }
  1211. else if (Rnd.get(100) < 15)
  1212. {
  1213. skill = SkillTable.getInstance().getInfo(4683, 1);
  1214. }
  1215. else
  1216. {
  1217. if (Rnd.get(2) == 0) // TODO: replace me with direction, to check if player standing on left or right side of valakas
  1218. skill = SkillTable.getInstance().getInfo(4681, 1); // left hand
  1219. else
  1220. skill = SkillTable.getInstance().getInfo(4682, 1); // right hand
  1221. }
  1222. }
  1223. else if (Rnd.get(100) < 0)
  1224. {
  1225. skill = SkillTable.getInstance().getInfo(4690, 1);
  1226. }
  1227. else if (Rnd.get(100) < 10)
  1228. {
  1229. skill = SkillTable.getInstance().getInfo(4689, 1);
  1230. }
  1231. else
  1232. {
  1233. skill = SkillTable.getInstance().getInfo(4684, 1);
  1234. }
  1235. }
  1236. }
  1237. if (skill != null)
  1238. callSkillAI(npc, c2, skill);
  1239. }
  1240. public void callSkillAI(L2Npc npc, L2Character c2, L2Skill skill)
  1241. {
  1242. QuestTimer timer = getQuestTimer("1003", npc, null);
  1243. if (npc == null)
  1244. {
  1245. if (timer != null)
  1246. timer.cancel();
  1247. return;
  1248. }
  1249. if (npc.isInvul())
  1250. return;
  1251. if (c2 == null || c2.isDead() || timer == null)
  1252. {
  1253. c2 = getRandomTarget(npc); // just in case if hate AI fail
  1254. if (timer == null)
  1255. {
  1256. startQuestTimer("1003", 500, npc, null, true);
  1257. return;
  1258. }
  1259. }
  1260. L2Character target = c2;
  1261. if (target == null || target.isDead())
  1262. {
  1263. return;
  1264. }
  1265. if (Util.checkIfInRange(skill.getCastRange(), npc, target, true))
  1266. {
  1267. timer.cancel();
  1268. npc.getAI().setIntention(AI_INTENTION_IDLE);
  1269. npc.setIsCastingNow(true);
  1270. npc.setTarget(target);
  1271. npc.doCast(skill);
  1272. }
  1273. else
  1274. {
  1275. npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null);
  1276. npc.setIsCastingNow(false);
  1277. }
  1278. }
  1279. public void broadcastSpawn(L2Npc npc)
  1280. {
  1281. Collection<L2Object> objs = npc.getKnownList().getKnownObjects().values();
  1282. {
  1283. for (L2Object obj : objs)
  1284. {
  1285. if (obj instanceof L2PcInstance)
  1286. {
  1287. if (Util.checkIfInRange(10000, npc, obj, true))
  1288. {
  1289. ((L2Character) obj).sendPacket(new PlaySound(1, "B03_A", 1, npc.getObjectId(), 212852, -114842, -1632));
  1290. ((L2Character) obj).sendPacket(new SocialAction(npc.getObjectId(), 3));
  1291. }
  1292. }
  1293. }
  1294. }
  1295. return;
  1296. }
  1297. public L2Character getRandomTarget(L2Npc npc)
  1298. {
  1299. FastList<L2Character> result = new FastList<L2Character>();
  1300. Collection<L2Object> objs = npc.getKnownList().getKnownObjects().values();
  1301. {
  1302. for (L2Object obj : objs)
  1303. {
  1304. if (obj instanceof L2PcInstance || obj instanceof L2Summon || obj instanceof L2DecoyInstance)
  1305. {
  1306. if (Util.checkIfInRange(5000, npc, obj, true) && !((L2Character) obj).isDead() && !((L2Character) obj).isGM())
  1307. result.add((L2Character) obj);
  1308. }
  1309. }
  1310. }
  1311. if (!result.isEmpty() && result.size() != 0)
  1312. {
  1313. Object[] characters = result.toArray();
  1314. return (L2Character) characters[Rnd.get(characters.length)];
  1315. }
  1316. return null;
  1317. }
  1318. @Override
  1319. public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill)
  1320. {
  1321. if (npc.isInvul())
  1322. {
  1323. return null;
  1324. }
  1325. else if (npc.getNpcId() == VALAKAS && !npc.isInvul())
  1326. {
  1327. getRandomSkill(npc);
  1328. }
  1329. return super.onSpellFinished(npc, player, skill);
  1330. }
  1331. @Override
  1332. public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
  1333. {
  1334. int i1 = 0;
  1335. if (GrandBossManager.getInstance().getBossStatus(VALAKAS) == FIGHTING)
  1336. {
  1337. if (npc.getCurrentHp() > ((npc.getMaxHp() * 1) / 4))
  1338. {
  1339. if (player == c_quest2)
  1340. {
  1341. if (((10 * 1000) + 1000) > i_quest2)
  1342. {
  1343. i_quest2 = ((10 * 1000) + Rnd.get(3000));
  1344. }
  1345. }
  1346. else if (player == c_quest3)
  1347. {
  1348. if (((10 * 1000) + 1000) > i_quest3)
  1349. {
  1350. i_quest3 = ((10 * 1000) + Rnd.get(3000));
  1351. }
  1352. }
  1353. else if (player == c_quest4)
  1354. {
  1355. if (((10 * 1000) + 1000) > i_quest4)
  1356. {
  1357. i_quest4 = ((10 * 1000) + Rnd.get(3000));
  1358. }
  1359. }
  1360. else if (i_quest2 > i_quest3)
  1361. {
  1362. i1 = 3;
  1363. }
  1364. else if (i_quest2 == i_quest3)
  1365. {
  1366. if (Rnd.get(100) < 50)
  1367. {
  1368. i1 = 2;
  1369. }
  1370. else
  1371. {
  1372. i1 = 3;
  1373. }
  1374. }
  1375. else if (i_quest2 < i_quest3)
  1376. {
  1377. i1 = 2;
  1378. }
  1379. if (i1 == 2)
  1380. {
  1381. if (i_quest2 > i_quest4)
  1382. {
  1383. i1 = 4;
  1384. }
  1385. else if (i_quest2 == i_quest4)
  1386. {
  1387. if (Rnd.get(100) < 50)
  1388. {
  1389. i1 = 2;
  1390. }
  1391. else
  1392. {
  1393. i1 = 4;
  1394. }
  1395. }
  1396. else if (i_quest2 < i_quest4)
  1397. {
  1398. i1 = 2;
  1399. }
  1400. }
  1401. else if (i1 == 3)
  1402. {
  1403. if (i_quest3 > i_quest4)
  1404. {
  1405. i1 = 4;
  1406. }
  1407. else if (i_quest3 == i_quest4)
  1408. {
  1409. if (Rnd.get(100) < 50)
  1410. {
  1411. i1 = 3;
  1412. }
  1413. else
  1414. {
  1415. i1 = 4;
  1416. }
  1417. }
  1418. else if (i_quest3 < i_quest4)
  1419. {
  1420. i1 = 3;
  1421. }
  1422. }
  1423. if (i1 == 2)
  1424. {
  1425. i_quest2 = ((10 * 1000) + Rnd.get(3000));
  1426. c_quest2 = player;
  1427. }
  1428. else if (i1 == 3)
  1429. {
  1430. i_quest3 = ((10 * 1000) + Rnd.get(3000));
  1431. c_quest3 = player;
  1432. }
  1433. else if (i1 == 4)
  1434. {
  1435. i_quest4 = ((10 * 1000) + Rnd.get(3000));
  1436. c_quest4 = player;
  1437. }
  1438. }
  1439. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 2) / 4))
  1440. {
  1441. if (player == c_quest2)
  1442. {
  1443. if (((6 * 1000) + 1000) > i_quest2)
  1444. {
  1445. i_quest2 = ((6 * 1000) + Rnd.get(3000));
  1446. }
  1447. }
  1448. else if (player == c_quest3)
  1449. {
  1450. if (((6 * 1000) + 1000) > i_quest3)
  1451. {
  1452. i_quest3 = ((6 * 1000) + Rnd.get(3000));
  1453. }
  1454. }
  1455. else if (player == c_quest4)
  1456. {
  1457. if (((6 * 1000) + 1000) > i_quest4)
  1458. {
  1459. i_quest4 = ((6 * 1000) + Rnd.get(3000));
  1460. }
  1461. }
  1462. else if (i_quest2 > i_quest3)
  1463. {
  1464. i1 = 3;
  1465. }
  1466. else if (i_quest2 == i_quest3)
  1467. {
  1468. if (Rnd.get(100) < 50)
  1469. {
  1470. i1 = 2;
  1471. }
  1472. else
  1473. {
  1474. i1 = 3;
  1475. }
  1476. }
  1477. else if (i_quest2 < i_quest3)
  1478. {
  1479. i1 = 2;
  1480. }
  1481. if (i1 == 2)
  1482. {
  1483. if (i_quest2 > i_quest4)
  1484. {
  1485. i1 = 4;
  1486. }
  1487. else if (i_quest2 == i_quest4)
  1488. {
  1489. if (Rnd.get(100) < 50)
  1490. {
  1491. i1 = 2;
  1492. }
  1493. else
  1494. {
  1495. i1 = 4;
  1496. }
  1497. }
  1498. else if (i_quest2 < i_quest4)
  1499. {
  1500. i1 = 2;
  1501. }
  1502. }
  1503. else if (i1 == 3)
  1504. {
  1505. if (i_quest3 > i_quest4)
  1506. {
  1507. i1 = 4;
  1508. }
  1509. else if (i_quest3 == i_quest4)
  1510. {
  1511. if (Rnd.get(100) < 50)
  1512. {
  1513. i1 = 3;
  1514. }
  1515. else
  1516. {
  1517. i1 = 4;
  1518. }
  1519. }
  1520. else if (i_quest3 < i_quest4)
  1521. {
  1522. i1 = 3;
  1523. }
  1524. }
  1525. if (i1 == 2)
  1526. {
  1527. i_quest2 = ((6 * 1000) + Rnd.get(3000));
  1528. c_quest2 = player;
  1529. }
  1530. else if (i1 == 3)
  1531. {
  1532. i_quest3 = ((6 * 1000) + Rnd.get(3000));
  1533. c_quest3 = player;
  1534. }
  1535. else if (i1 == 4)
  1536. {
  1537. i_quest4 = ((6 * 1000) + Rnd.get(3000));
  1538. c_quest4 = player;
  1539. }
  1540. }
  1541. else if (npc.getCurrentHp() > ((npc.getMaxHp() * 3) / 4.0))
  1542. {
  1543. if (player == c_quest2)
  1544. {
  1545. if (((3 * 1000) + 1000) > i_quest2)
  1546. {
  1547. i_quest2 = ((3 * 1000) + Rnd.get(3000));
  1548. }
  1549. }
  1550. else if (player == c_quest3)
  1551. {
  1552. if (((3 * 1000) + 1000) > i_quest3)
  1553. {
  1554. i_quest3 = ((3 * 1000) + Rnd.get(3000));
  1555. }
  1556. }
  1557. else if (player == c_quest4)
  1558. {
  1559. if (((3 * 1000) + 1000) > i_quest4)
  1560. {
  1561. i_quest4 = ((3 * 1000) + Rnd.get(3000));
  1562. }
  1563. }
  1564. else if (i_quest2 > i_quest3)
  1565. {
  1566. i1 = 3;
  1567. }
  1568. else if (i_quest2 == i_quest3)
  1569. {
  1570. if (Rnd.get(100) < 50)
  1571. {
  1572. i1 = 2;
  1573. }
  1574. else
  1575. {
  1576. i1 = 3;
  1577. }
  1578. }
  1579. else if (i_quest2 < i_quest3)
  1580. {
  1581. i1 = 2;
  1582. }
  1583. if (i1 == 2)
  1584. {
  1585. if (i_quest2 > i_quest4)
  1586. {
  1587. i1 = 4;
  1588. }
  1589. else if (i_quest2 == i_quest4)
  1590. {
  1591. if (Rnd.get(100) < 50)
  1592. {
  1593. i1 = 2;
  1594. }
  1595. else
  1596. {
  1597. i1 = 4;
  1598. }
  1599. }
  1600. else if (i_quest2 < i_quest4)
  1601. {
  1602. i1 = 2;
  1603. }
  1604. }
  1605. else if (i1 == 3)
  1606. {
  1607. if (i_quest3 > i_quest4)
  1608. {
  1609. i1 = 4;
  1610. }
  1611. else if (i_quest3 == i_quest4)
  1612. {
  1613. if (Rnd.get(100) < 50)
  1614. {
  1615. i1 = 3;
  1616. }
  1617. else
  1618. {
  1619. i1 = 4;
  1620. }
  1621. }
  1622. else if (i_quest3 < i_quest4)
  1623. {
  1624. i1 = 3;
  1625. }
  1626. }
  1627. if (i1 == 2)
  1628. {
  1629. i_quest2 = ((3 * 1000) + Rnd.get(3000));
  1630. c_quest2 = player;
  1631. }
  1632. else if (i1 == 3)
  1633. {
  1634. i_quest3 = ((3 * 1000) + Rnd.get(3000));
  1635. c_quest3 = player;
  1636. }
  1637. else if (i1 == 4)
  1638. {
  1639. i_quest4 = ((3 * 1000) + Rnd.get(3000));
  1640. c_quest4 = player;
  1641. }
  1642. }
  1643. else if (player == c_quest2)
  1644. {
  1645. if (((2 * 1000) + 1000) > i_quest2)
  1646. {
  1647. i_quest2 = ((2 * 1000) + Rnd.get(3000));
  1648. }
  1649. }
  1650. else if (player == c_quest3)
  1651. {
  1652. if (((2 * 1000) + 1000) > i_quest3)
  1653. {
  1654. i_quest3 = ((2 * 1000) + Rnd.get(3000));
  1655. }
  1656. }
  1657. else if (player == c_quest4)
  1658. {
  1659. if (((2 * 1000) + 1000) > i_quest4)
  1660. {
  1661. i_quest4 = ((2 * 1000) + Rnd.get(3000));
  1662. }
  1663. }
  1664. else if (i_quest2 > i_quest3)
  1665. {
  1666. i1 = 3;
  1667. }
  1668. else if (i_quest2 == i_quest3)
  1669. {
  1670. if (Rnd.get(100) < 50)
  1671. {
  1672. i1 = 2;
  1673. }
  1674. else
  1675. {
  1676. i1 = 3;
  1677. }
  1678. }
  1679. else if (i_quest2 < i_quest3)
  1680. {
  1681. i1 = 2;
  1682. }
  1683. if (i1 == 2)
  1684. {
  1685. if (i_quest2 > i_quest4)
  1686. {
  1687. i1 = 4;
  1688. }
  1689. else if (i_quest2 == i_quest4)
  1690. {
  1691. if (Rnd.get(100) < 50)
  1692. {
  1693. i1 = 2;
  1694. }
  1695. else
  1696. {
  1697. i1 = 4;
  1698. }
  1699. }
  1700. else if (i_quest2 < i_quest4)
  1701. {
  1702. i1 = 2;
  1703. }
  1704. }
  1705. else if (i1 == 3)
  1706. {
  1707. if (i_quest3 > i_quest4)
  1708. {
  1709. i1 = 4;
  1710. }
  1711. else if (i_quest3 == i_quest4)
  1712. {
  1713. if (Rnd.get(100) < 50)
  1714. {
  1715. i1 = 3;
  1716. }
  1717. else
  1718. {
  1719. i1 = 4;
  1720. }
  1721. }
  1722. else if (i_quest3 < i_quest4)
  1723. {
  1724. i1 = 3;
  1725. }
  1726. }
  1727. if (i1 == 2)
  1728. {
  1729. i_quest2 = ((2 * 1000) + Rnd.get(3000));
  1730. c_quest2 = player;
  1731. }
  1732. else if (i1 == 3)
  1733. {
  1734. i_quest3 = ((2 * 1000) + Rnd.get(3000));
  1735. c_quest3 = player;
  1736. }
  1737. else if (i1 == 4)
  1738. {
  1739. i_quest4 = ((2 * 1000) + Rnd.get(3000));
  1740. c_quest4 = player;
  1741. }
  1742. }
  1743. else if (player == c_quest2)
  1744. {
  1745. if (((1 * 1000) + 1000) > i_quest2)
  1746. {
  1747. i_quest2 = ((1 * 1000) + Rnd.get(3000));
  1748. }
  1749. }
  1750. else if (player == c_quest3)
  1751. {
  1752. if (((1 * 1000) + 1000) > i_quest3)
  1753. {
  1754. i_quest3 = ((1 * 1000) + Rnd.get(3000));
  1755. }
  1756. }
  1757. else if (player == c_quest4)
  1758. {
  1759. if (((1 * 1000) + 1000) > i_quest4)
  1760. {
  1761. i_quest4 = ((1 * 1000) + Rnd.get(3000));
  1762. }
  1763. }
  1764. else if (i_quest2 > i_quest3)
  1765. {
  1766. i1 = 3;
  1767. }
  1768. else if (i_quest2 == i_quest3)
  1769. {
  1770. if (Rnd.get(100) < 50)
  1771. {
  1772. i1 = 2;
  1773. }
  1774. else
  1775. {
  1776. i1 = 3;
  1777. }
  1778. }
  1779. else if (i_quest2 < i_quest3)
  1780. {
  1781. i1 = 2;
  1782. }
  1783. if (i1 == 2)
  1784. {
  1785. if (i_quest2 > i_quest4)
  1786. {
  1787. i1 = 4;
  1788. }
  1789. else if (i_quest2 == i_quest4)
  1790. {
  1791. if (Rnd.get(100) < 50)
  1792. {
  1793. i1 = 2;
  1794. }
  1795. else
  1796. {
  1797. i1 = 4;
  1798. }
  1799. }
  1800. else if (i_quest2 < i_quest4)
  1801. {
  1802. i1 = 2;
  1803. }
  1804. }
  1805. else if (i1 == 3)
  1806. {
  1807. if (i_quest3 > i_quest4)
  1808. {
  1809. i1 = 4;
  1810. }
  1811. else if (i_quest3 == i_quest4)
  1812. {
  1813. if (Rnd.get(100) < 50)
  1814. {
  1815. i1 = 3;
  1816. }
  1817. else
  1818. {
  1819. i1 = 4;
  1820. }
  1821. }
  1822. else if (i_quest3 < i_quest4)
  1823. {
  1824. i1 = 3;
  1825. }
  1826. }
  1827. if (i1 == 2)
  1828. {
  1829. i_quest2 = ((1 * 1000) + Rnd.get(3000));
  1830. c_quest2 = player;
  1831. }
  1832. else if (i1 == 3)
  1833. {
  1834. i_quest3 = ((1 * 1000) + Rnd.get(3000));
  1835. c_quest3 = player;
  1836. }
  1837. else if (i1 == 4)
  1838. {
  1839. i_quest4 = ((1 * 1000) + Rnd.get(3000));
  1840. c_quest4 = player;
  1841. }
  1842. if (GrandBossManager.getInstance().getBossStatus(VALAKAS) == FIGHTING && !npc.isInvul())
  1843. {
  1844. getRandomSkill(npc);
  1845. }
  1846. else
  1847. return null;
  1848. return super.onAggroRangeEnter(npc, player, isPet);
  1849. }
  1850. @Override
  1851. public String onSkillSee(L2Npc npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
  1852. {
  1853. if (npc.isInvul())
  1854. {
  1855. return null;
  1856. }
  1857. npc.setTarget(caster);
  1858. return super.onSkillSee(npc, caster, skill, targets, isPet);
  1859. }
  1860. public static void main(String[] args)
  1861. {
  1862. // now call the constructor (starts up the ai)
  1863. new Valakas(-1, "valakas", "ai");
  1864. }
  1865. }