RainbowSpringsChateau.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  1. package conquerablehalls.RainbowSpringsChateau;
  2. import gnu.trove.TIntLongHashMap;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.concurrent.ScheduledFuture;
  13. import java.util.logging.Logger;
  14. import com.l2jserver.L2DatabaseFactory;
  15. import com.l2jserver.gameserver.Announcements;
  16. import com.l2jserver.gameserver.ThreadPoolManager;
  17. import com.l2jserver.gameserver.datatables.ClanTable;
  18. import com.l2jserver.gameserver.datatables.NpcTable;
  19. import com.l2jserver.gameserver.datatables.SkillTable;
  20. import com.l2jserver.gameserver.datatables.SpawnTable;
  21. import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
  22. import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
  23. import com.l2jserver.gameserver.instancemanager.ZoneManager;
  24. import com.l2jserver.gameserver.model.L2Clan;
  25. import com.l2jserver.gameserver.model.L2ItemInstance;
  26. import com.l2jserver.gameserver.model.L2Object;
  27. import com.l2jserver.gameserver.model.L2Skill;
  28. import com.l2jserver.gameserver.model.L2Spawn;
  29. import com.l2jserver.gameserver.model.actor.L2Character;
  30. import com.l2jserver.gameserver.model.actor.L2Npc;
  31. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  32. import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
  33. import com.l2jserver.gameserver.model.entity.clanhall.SiegeStatus;
  34. import com.l2jserver.gameserver.model.quest.Quest;
  35. import com.l2jserver.gameserver.model.quest.QuestState;
  36. import com.l2jserver.gameserver.model.quest.State;
  37. import com.l2jserver.gameserver.model.zone.L2ZoneType;
  38. import com.l2jserver.gameserver.network.clientpackets.Say2;
  39. import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  40. import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  41. import com.l2jserver.gameserver.templates.item.L2Item;
  42. import com.l2jserver.util.Rnd;
  43. /**
  44. * @author BiggBoss
  45. * Rainbow Springs Cheateau clan hall siege script
  46. */
  47. public class RainbowSpringsChateau extends Quest
  48. {
  49. private static final Logger _log = Logger.getLogger(RainbowSpringsChateau.class.getName());
  50. private static class SetFinalAttackers implements Runnable
  51. {
  52. @Override
  53. public void run()
  54. {
  55. if(_rainbow == null)
  56. _rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
  57. int spotLeft = 4;
  58. if(_rainbow.getOwnerId() > 0)
  59. {
  60. L2Clan owner = ClanTable.getInstance().getClan(_rainbow.getOwnerId());
  61. if(owner != null)
  62. {
  63. _rainbow.free();
  64. owner.setHasHideout(0);
  65. _acceptedClans.add(owner);
  66. --spotLeft;
  67. }
  68. for(int i = 0; i < spotLeft; i++)
  69. {
  70. long counter = 0;
  71. L2Clan clan = null;
  72. for(int clanId : _warDecreesCount.keys())
  73. {
  74. L2Clan actingClan = ClanTable.getInstance().getClan(clanId);
  75. if(actingClan == null || actingClan.getDissolvingExpiryTime() > 0)
  76. {
  77. _warDecreesCount.remove(clanId);
  78. continue;
  79. }
  80. final long count = _warDecreesCount.get(clanId);
  81. if(count > counter)
  82. { counter = count;
  83. clan = actingClan;
  84. }
  85. }
  86. if(_acceptedClans.size() < 4)
  87. {
  88. _acceptedClans.add(clan);
  89. L2PcInstance leader = clan.getLeader().getPlayerInstance();
  90. if(leader != null)
  91. leader.sendMessage("Your clan has been accepted to join the RainBow Srpings Chateau siege!");
  92. }
  93. }
  94. if(_acceptedClans.size() >= 2)
  95. {
  96. _nextSiege = ThreadPoolManager.getInstance().scheduleGeneral(new SiegeStart(), 3600000);
  97. _rainbow.updateSiegeStatus(SiegeStatus.WAITING_BATTLE);
  98. }
  99. else
  100. Announcements.getInstance().announceToAll("Rainbow Springs Chateau siege aborted due lack of population");
  101. }
  102. }
  103. }
  104. private static class SiegeStart implements Runnable
  105. {
  106. @Override
  107. public void run()
  108. {
  109. if(_rainbow == null)
  110. _rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
  111. //XXX _rainbow.siegeStarts();
  112. spawnGourds();
  113. _siegeEnd = ThreadPoolManager.getInstance().scheduleGeneral(new SiegeEnd(null), _rainbow.getSiegeLenght() - 120000);
  114. }
  115. }
  116. private static class SiegeEnd implements Runnable
  117. {
  118. private L2Clan _winner;
  119. private SiegeEnd(L2Clan winner)
  120. {
  121. _winner = winner;
  122. }
  123. @Override
  124. public void run()
  125. {
  126. if(_rainbow == null)
  127. _rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
  128. unSpawnGourds();
  129. if(_winner != null)
  130. _rainbow.setOwner(_winner);
  131. //XXX _rainbow.siegeEnds();
  132. ThreadPoolManager.getInstance().scheduleGeneral(new SetFinalAttackers(), _rainbow.getNextSiegeTime());
  133. setRegistrationEndString(_rainbow.getNextSiegeTime() + System.currentTimeMillis() - 3600000);
  134. // Teleport out of the arenas is made 2 mins after game ends
  135. ThreadPoolManager.getInstance().scheduleGeneral(new TeleportBack(), 120000);
  136. }
  137. }
  138. private static class TeleportBack implements Runnable
  139. {
  140. @Override
  141. public void run()
  142. {
  143. for(int arenaId : ARENA_ZONES)
  144. {
  145. L2ZoneType zone = ZoneManager.getInstance().getZoneById(arenaId);
  146. for(L2Character cha : (L2Character[])zone.getCharactersInside().getValues())
  147. cha.teleToLocation(TeleportWhereType.Town);
  148. }
  149. }
  150. }
  151. private static final String qn = "RainbowSpringsChateau";
  152. private static final int RAINBOW_SPRINGS = 62;
  153. private static final int WAR_DECREES = 8034;
  154. private static final int RAINBOW_NECTAR= 8030;
  155. private static final int RAINBOW_MWATER = 8031;
  156. private static final int RAINBOW_WATER = 8032;
  157. private static final int RAINBOW_SULFUR = 8033;
  158. private static final int MESSENGER = 35604;
  159. private static final int CARETAKER = 35603;
  160. private static final int CHEST = 35593;
  161. private static final int[] GOURDS = { 35588, 35589, 35590, 35591 };
  162. private static L2Spawn[] _gourds = new L2Spawn[4];
  163. private static final int[] YETIS = { 35596, 35597, 35598, 35599 };
  164. private static final int[][] ARENAS =
  165. {
  166. { 151562, -127080, -2214 }, // Arena 1
  167. { 153141, -125335, -2214 }, // Arena 2
  168. { 153892, -127530, -2214 }, // Arena 3
  169. { 155657, -125752, -2214 }, // Arena 4
  170. };
  171. private static final int[] ARENA_ZONES = { 112081, 112082, 112083, 112084 };
  172. private static final String[] _textPassages =
  173. {
  174. "Text Passage 1",
  175. "Passage Text 2",
  176. "Im getting out of ideas",
  177. "But i can write few more",
  178. "Are five sentences",
  179. "enough for this f*** siege?",
  180. "i think ill add few more",
  181. "like this one",
  182. "Please, if you know the true passages",
  183. "Contact me at L2JForum =)"
  184. };
  185. private static final L2Skill[] DEBUFFS =
  186. {
  187. SkillTable.getInstance().getInfo(0, 1)
  188. };
  189. private static TIntLongHashMap _warDecreesCount = new TIntLongHashMap();
  190. private static List<L2Clan> _acceptedClans = new ArrayList<L2Clan>(4);
  191. private static Map<String, ArrayList<L2Clan>> _usedTextPassages = new HashMap<String, ArrayList<L2Clan>>();
  192. private static Map<L2Clan, Integer> _pendingItemToGet = new HashMap<L2Clan, Integer>();
  193. private static SiegableHall _rainbow;
  194. private static ScheduledFuture<?> _nextSiege, _siegeEnd;
  195. private static String _registrationEnds;
  196. /**
  197. * @param questId
  198. * @param name
  199. * @param descr
  200. */
  201. public RainbowSpringsChateau(int questId, String name, String descr)
  202. {
  203. super(questId, name, descr);
  204. addFirstTalkId(MESSENGER);
  205. addTalkId(MESSENGER);
  206. addFirstTalkId(CARETAKER);
  207. addTalkId(CARETAKER);
  208. for(int npc : YETIS)
  209. {
  210. addFirstTalkId(npc);
  211. addTalkId(npc);
  212. }
  213. loadAttackers();
  214. _rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
  215. if(_rainbow != null)
  216. {
  217. long delay = _rainbow.getNextSiegeTime();
  218. if(delay > -1)
  219. {
  220. setRegistrationEndString(delay - 3600000);
  221. _nextSiege = ThreadPoolManager.getInstance().scheduleGeneral(new SetFinalAttackers(), delay);
  222. }
  223. else
  224. _log.warning("CHSiegeManager: No Date setted for RainBow Springs Chateau Clan hall siege!. SIEGE CANCELED!");
  225. }
  226. }
  227. @Override
  228. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  229. {
  230. if(player.getQuestState(qn) == null)
  231. {
  232. QuestState state = newQuestState(player);
  233. state.setState(State.STARTED);
  234. }
  235. int npcId = npc.getNpcId();
  236. String html = "";
  237. if(npcId == MESSENGER)
  238. {
  239. sendMessengerMain(player);
  240. }
  241. else if(npcId == CARETAKER)
  242. {
  243. html = "caretaker_main.htm";
  244. }
  245. else if(_rainbow.isInSiege())
  246. {
  247. if(!player.isClanLeader())
  248. html = "no_clan_leader.htm";
  249. else
  250. {
  251. L2Clan clan = player.getClan();
  252. if(clan != null && _acceptedClans.contains(clan))
  253. {
  254. int index = _acceptedClans.indexOf(clan);
  255. if(npcId == YETIS[index])
  256. html = "yeti_main.htm";
  257. }
  258. }
  259. }
  260. player.setLastQuestNpcObject(npc.getObjectId());
  261. return html;
  262. }
  263. @Override
  264. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  265. {
  266. if(!player.isClanLeader())
  267. return "no_clan_leader.htm";
  268. String html = event;
  269. final L2Clan clan = player.getClan();
  270. final int clanId = clan.getClanId();
  271. if(event.equals("register"))
  272. {
  273. if(!_rainbow.isRegistering())
  274. html = "messenger_not_registering.htm";
  275. else if(_warDecreesCount.containsKey(clanId))
  276. html = "messenger_alredy_registered.htm";
  277. else if(clan.getLevel() < 3 || clan.getMembersCount() < 5)
  278. html = "messenger_no_level.htm";
  279. else
  280. {
  281. L2ItemInstance warDecrees = player.getInventory().getItemByItemId(WAR_DECREES);
  282. if(warDecrees == null)
  283. html = "messenger_nowardecrees.htm";
  284. else
  285. {
  286. long count = warDecrees.getCount();
  287. _warDecreesCount.put(clanId, count);
  288. player.destroyItem("Rainbow Springs Registration", warDecrees, npc, true);
  289. updateAttacker(clanId, count, false);
  290. html = "messenger_registered.htm";
  291. }
  292. }
  293. }
  294. else if(event.equals("unregister"))
  295. {
  296. if(!_warDecreesCount.containsKey(clanId))
  297. html = "messenger_notinlist.htm";
  298. else if(_rainbow.isRegistering())
  299. {
  300. String[] split = event.split("_");
  301. int step = Integer.parseInt(split[1]);
  302. switch(step)
  303. {
  304. case 0:
  305. html = "messenger_unregister_confirmation.htm";
  306. break;
  307. case 1:
  308. html = "messenger_retrive_wardecrees.htm";
  309. updateAttacker(clanId, 0, true);
  310. break;
  311. case 2:
  312. html = "messenger_unregistered.htm";
  313. long toRetrive = _warDecreesCount.get(clanId) / 2;
  314. player.addItem("Rainbow Spring unregister", WAR_DECREES, toRetrive, npc, true);
  315. _warDecreesCount.remove(clanId);
  316. break;
  317. default:
  318. html = "messenger_main.htm";
  319. }
  320. }
  321. else if(_rainbow.isWaitingBattle())
  322. {
  323. if(!_acceptedClans.contains(clan))
  324. return "messenger_notinlist.htm";
  325. String[] split = event.split("_");
  326. int step = Integer.parseInt(split[1]);
  327. switch(step)
  328. {
  329. case 0:
  330. html = "messenger_unregister_confirmation_no_retrive.htm";
  331. break;
  332. case 1:
  333. html = "messenger_unregistered.htm";
  334. _acceptedClans.remove(clan);
  335. break;
  336. default:
  337. html = "messenger_main.htm";
  338. }
  339. }
  340. }
  341. else if(event.equals("portToArena"))
  342. {
  343. if(!_acceptedClans.contains(clan))
  344. html = "caretaker_not_allowed.htm";
  345. else if(player.getParty() == null)
  346. html = "caretaker_no_party.htm";
  347. else
  348. {
  349. int index = _acceptedClans.indexOf(clan);
  350. portToArena(player, index);
  351. }
  352. }
  353. else if(event.startsWith("enterText"))
  354. {
  355. // Shouldnt happen
  356. if(!_acceptedClans.contains(clan))
  357. return null;
  358. String[] split = event.split("_");
  359. if(split.length < 2)
  360. return null;
  361. final String passage = split[1];
  362. if(!isValidPassage(passage))
  363. return null;
  364. if(_usedTextPassages.containsKey(passage))
  365. {
  366. ArrayList<L2Clan> list = _usedTextPassages.get(passage);
  367. if(list.contains(clan))
  368. html = "yeti_passage_used.htm";
  369. else
  370. {
  371. list.add(clan);
  372. synchronized(_pendingItemToGet)
  373. {
  374. if(_pendingItemToGet.containsKey(clan))
  375. {
  376. int left = _pendingItemToGet.get(clan);
  377. ++left;
  378. _pendingItemToGet.put(clan, left);
  379. }
  380. else
  381. _pendingItemToGet.put(clan, 1);
  382. }
  383. html = "yeti_item_exchange.htm";
  384. }
  385. }
  386. }
  387. else if(event.startsWith("getItem"))
  388. {
  389. if(!_pendingItemToGet.containsKey(clanId))
  390. html = "yeti_cannot_exchange.htm";
  391. int left = _pendingItemToGet.get(clan);
  392. if(left > 0)
  393. {
  394. int itemId = Integer.parseInt(event.split("_")[1]);
  395. player.addItem("Rainbow Spring Chateau Siege", itemId, 1, npc, true);
  396. --left;
  397. _pendingItemToGet.put(clan, left);
  398. html = "yeti_main.htm";
  399. }
  400. else
  401. html = "yeti_cannot_exchange.htm";
  402. }
  403. return html;
  404. }
  405. @Override
  406. public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
  407. {
  408. if(!_rainbow.isInSiege())
  409. return null;
  410. final L2Clan clan = killer.getClan();
  411. if(clan == null || !_acceptedClans.contains(clan))
  412. return null;
  413. final int npcId = npc.getNpcId();
  414. final int index = _acceptedClans.indexOf(clan);
  415. if(npcId == CHEST)
  416. {
  417. shoutRandomText(npc);
  418. }
  419. else if(npcId == GOURDS[index])
  420. {
  421. synchronized(this)
  422. {
  423. if(_siegeEnd != null)
  424. _siegeEnd.cancel(false);
  425. ThreadPoolManager.getInstance().executeTask(new SiegeEnd(clan));
  426. }
  427. }
  428. return null;
  429. }
  430. @Override
  431. public String onItemUse(L2Item item, L2PcInstance player)
  432. {
  433. if(!_rainbow.isInSiege())
  434. return null;
  435. L2Object target = player.getTarget();
  436. if(target == null || !(target instanceof L2Npc))
  437. return null;
  438. int yeti = ((L2Npc)target).getNpcId();
  439. if(!isYetiTarget(yeti))
  440. return null;
  441. final L2Clan clan = player.getClan();
  442. if(clan == null || !_acceptedClans.contains(clan))
  443. return null;
  444. final int itemId = item.getItemId();
  445. // Nectar must spawn the enraged yeti. Dunno if it makes any other thing
  446. // Also, the items must execute:
  447. // - Reduce gourd hpb ( reduceGourdHp(int, L2PcInstance) )
  448. // - Cast debuffs on enemy clans ( castDebuffsOnEnemies(int) )
  449. // - Change arena gourds ( moveGourds() )
  450. // - Increase gourd hp ( increaseGourdHp(int) )
  451. if(itemId == RAINBOW_NECTAR)
  452. {
  453. // Spawn enraged (where?)
  454. reduceGourdHp(_acceptedClans.indexOf(clan), player);
  455. }
  456. else if(itemId == RAINBOW_MWATER)
  457. {
  458. increaseGourdHp(_acceptedClans.indexOf(clan));
  459. }
  460. else if(itemId == RAINBOW_WATER)
  461. {
  462. moveGourds();
  463. }
  464. else if(itemId == RAINBOW_SULFUR)
  465. {
  466. castDebuffsOnEnemies(_acceptedClans.indexOf(clan));
  467. }
  468. return null;
  469. }
  470. private static void portToArena(L2PcInstance leader, int arena)
  471. {
  472. if(arena < 0 || arena > 3)
  473. {
  474. _log.warning("RainbowSptringChateau siege: Wrong arena id passed: "+arena);
  475. return;
  476. }
  477. for(L2PcInstance pc : leader.getParty().getPartyMembers())
  478. if(pc != null)
  479. {
  480. pc.stopAllEffects();
  481. if(pc.getPet() != null)
  482. pc.getPet().unSummon(pc);
  483. pc.teleToLocation(ARENAS[arena][0], ARENAS[arena][1], ARENAS[arena][2]);
  484. }
  485. }
  486. private static void spawnGourds()
  487. {
  488. for(int i = 0; i < _acceptedClans.size(); i++)
  489. {
  490. if(_gourds[i] == null)
  491. {
  492. try
  493. {
  494. _gourds[i] = new L2Spawn(NpcTable.getInstance().getTemplate(GOURDS[i]));
  495. _gourds[i].setLocx(ARENAS[i][0] + 150);
  496. _gourds[i].setLocy(ARENAS[i][1] + 150);
  497. _gourds[i].setLocz(ARENAS[i][2]);
  498. _gourds[i].setHeading(1);
  499. _gourds[i].setAmount(1);
  500. }
  501. catch(Exception e)
  502. {
  503. e.printStackTrace();
  504. }
  505. }
  506. SpawnTable.getInstance().addNewSpawn(_gourds[i], false);
  507. _gourds[i].init();
  508. }
  509. }
  510. private static void unSpawnGourds()
  511. {
  512. for(int i = 0; i < _acceptedClans.size(); i++)
  513. {
  514. _gourds[i].getLastSpawn().deleteMe();
  515. SpawnTable.getInstance().deleteSpawn(_gourds[i], false);
  516. }
  517. }
  518. private static void moveGourds()
  519. {
  520. L2Spawn[] tempArray = _gourds;
  521. int iterator = _acceptedClans.size();
  522. for(int i = 0; i < iterator; i++)
  523. {
  524. L2Spawn oldSpawn = _gourds[(iterator-1)-i];
  525. L2Spawn curSpawn = tempArray[i];
  526. _gourds[(iterator -1) - i] = curSpawn;
  527. int newX = oldSpawn.getLocx();
  528. int newY = oldSpawn.getLocy();
  529. int newZ = oldSpawn.getLocz();
  530. curSpawn.getLastSpawn().teleToLocation(newX, newY, newZ);
  531. }
  532. }
  533. private static void reduceGourdHp(int index, L2PcInstance player)
  534. {
  535. L2Spawn gourd = _gourds[index];
  536. gourd.getLastSpawn().reduceCurrentHp(1000, player, null);
  537. }
  538. private static void increaseGourdHp(int index)
  539. {
  540. L2Spawn gourd = _gourds[index];
  541. L2Npc gourdNpc = gourd.getLastSpawn();
  542. gourdNpc.setCurrentHp(gourdNpc.getCurrentHp() + 1000);
  543. }
  544. private static void castDebuffsOnEnemies(int myArena)
  545. {
  546. for(int id : ARENA_ZONES)
  547. {
  548. if(id == myArena)
  549. continue;
  550. for(L2Character plr : (L2Character[])ZoneManager.getInstance().getZoneById(id).getCharactersInside().getValues())
  551. {
  552. for(L2Skill sk : DEBUFFS)
  553. sk.getEffects(plr, plr);
  554. }
  555. }
  556. }
  557. private static void shoutRandomText(L2Npc npc)
  558. {
  559. int length = _textPassages.length;
  560. if(_usedTextPassages.size() >= length)
  561. return;
  562. int randomPos = Rnd.get(length);
  563. String message = _textPassages[randomPos];
  564. if(_usedTextPassages.containsKey(message))
  565. shoutRandomText(npc);
  566. else
  567. {
  568. _usedTextPassages.put(message, new ArrayList<L2Clan>());
  569. int shout = Say2.SHOUT;
  570. int objId = npc.getObjectId();
  571. NpcSay say = new NpcSay(objId, shout, npc.getNpcId(), message);
  572. npc.broadcastPacket(say);
  573. }
  574. }
  575. private static boolean isValidPassage(String text)
  576. {
  577. for(String st : _textPassages)
  578. if(st.equalsIgnoreCase(text))
  579. return true;
  580. return false;
  581. }
  582. private static boolean isYetiTarget(int npcId)
  583. {
  584. for(int yeti : YETIS)
  585. if(yeti == npcId)
  586. return true;
  587. return false;
  588. }
  589. private static void updateAttacker(int clanId, long count, boolean remove)
  590. {
  591. Connection con = null;
  592. try
  593. {
  594. con = L2DatabaseFactory.getInstance().getConnection();
  595. PreparedStatement statement;
  596. if(remove)
  597. {
  598. statement = con.prepareStatement("DELETE FROM rainbowsprings_attacker_list WHERE clanId = ?");
  599. statement.setInt(1, clanId);
  600. }
  601. else
  602. {
  603. statement = con.prepareStatement("INSERT INTO rainbowsprings_attacker_list VALUES (?,?)");
  604. statement.setInt(1, clanId);
  605. statement.setLong(2, count);
  606. }
  607. statement.execute();
  608. statement.close();
  609. }
  610. catch(Exception e)
  611. {
  612. e.printStackTrace();
  613. }
  614. finally
  615. {
  616. L2DatabaseFactory.close(con);
  617. }
  618. }
  619. private static void loadAttackers()
  620. {
  621. Connection con = null;
  622. try
  623. {
  624. con = L2DatabaseFactory.getInstance().getConnection();
  625. PreparedStatement statement = con.prepareStatement("SELECT * FROM rainbowsprings_attacker_list");
  626. ResultSet rset = statement.executeQuery();
  627. while(rset.next())
  628. {
  629. int clanId = rset.getInt("clan_id");
  630. long count = rset.getLong("decrees_count");
  631. _warDecreesCount.put(clanId, count);
  632. }
  633. rset.close();
  634. statement.close();
  635. }
  636. catch(Exception e)
  637. {
  638. e.printStackTrace();
  639. }
  640. finally
  641. {
  642. L2DatabaseFactory.close(con);
  643. }
  644. }
  645. private static void setRegistrationEndString(long time)
  646. {
  647. Calendar c = Calendar.getInstance();
  648. c.setTime(new Date(time));
  649. int year = c.get(Calendar.YEAR);
  650. int month = c.get(Calendar.MONTH) + 1;
  651. int day = c.get(Calendar.DAY_OF_MONTH);
  652. int hour = c.get(Calendar.HOUR);
  653. int mins = c.get(Calendar.MINUTE);
  654. _registrationEnds = year+"-"+month+"-"+day+" "+hour+":"+mins;
  655. }
  656. private static void sendMessengerMain(L2PcInstance player)
  657. {
  658. NpcHtmlMessage message = new NpcHtmlMessage(5);
  659. message.setFile(null, "data/scripts/conquerablehalls/RainbowSpringsChateau/messenger_main.htm");
  660. message.replace("%time%", _registrationEnds);
  661. player.sendPacket(message);
  662. }
  663. public static void launchSiege()
  664. {
  665. _nextSiege.cancel(false);
  666. ThreadPoolManager.getInstance().executeTask(new SiegeStart());
  667. }
  668. public static void endSiege()
  669. {
  670. if(_siegeEnd != null)
  671. _siegeEnd.cancel(false);
  672. ThreadPoolManager.getInstance().executeTask(new SiegeEnd(null));
  673. }
  674. public static void updateAdminDate(long date)
  675. {
  676. if(_rainbow == null)
  677. _rainbow = CHSiegeManager.getInstance().getSiegableHall(RAINBOW_SPRINGS);
  678. _rainbow.setNextSiegeDate(date);
  679. if(_nextSiege != null)
  680. _nextSiege.cancel(true);
  681. date -= 3600000;
  682. setRegistrationEndString(date);
  683. _nextSiege = ThreadPoolManager.getInstance().scheduleGeneral(new SetFinalAttackers(), _rainbow.getNextSiegeTime());
  684. }
  685. public static void main(String[] args)
  686. {
  687. new RainbowSpringsChateau(-1, qn, "conquerablehalls");
  688. }
  689. }