FlagWar.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  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 conquerablehalls.flagwar;
  16. import gnu.trove.map.hash.TIntObjectHashMap;
  17. import java.sql.Connection;
  18. import java.sql.PreparedStatement;
  19. import java.sql.ResultSet;
  20. import java.util.ArrayList;
  21. import com.l2jserver.L2DatabaseFactory;
  22. import com.l2jserver.gameserver.Announcements;
  23. import com.l2jserver.gameserver.ThreadPoolManager;
  24. import com.l2jserver.gameserver.ai.CtrlIntention;
  25. import com.l2jserver.gameserver.ai.L2SpecialSiegeGuardAI;
  26. import com.l2jserver.gameserver.cache.HtmCache;
  27. import com.l2jserver.gameserver.datatables.ClanTable;
  28. import com.l2jserver.gameserver.datatables.NpcTable;
  29. import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
  30. import com.l2jserver.gameserver.model.L2CharPosition;
  31. import com.l2jserver.gameserver.model.L2Clan;
  32. import com.l2jserver.gameserver.model.L2ClanMember;
  33. import com.l2jserver.gameserver.model.L2SiegeClan;
  34. import com.l2jserver.gameserver.model.L2SiegeClan.SiegeClanType;
  35. import com.l2jserver.gameserver.model.L2Spawn;
  36. import com.l2jserver.gameserver.model.L2World;
  37. import com.l2jserver.gameserver.model.Location;
  38. import com.l2jserver.gameserver.model.actor.L2Npc;
  39. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  40. import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
  41. import com.l2jserver.gameserver.model.entity.clanhall.ClanHallSiegeEngine;
  42. import com.l2jserver.gameserver.model.entity.clanhall.SiegeStatus;
  43. import com.l2jserver.gameserver.model.zone.type.L2ResidenceHallTeleportZone;
  44. import com.l2jserver.gameserver.network.SystemMessageId;
  45. import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  46. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  47. /**
  48. * @author BiggBoss
  49. */
  50. public abstract class FlagWar extends ClanHallSiegeEngine
  51. {
  52. protected static String qn;
  53. private static final String SQL_LOAD_ATTACKERS = "SELECT * FROM siegable_hall_flagwar_attackers WHERE hall_id = ?";
  54. private static final String SQL_SAVE_ATTACKER = "INSERT INTO siegable_hall_flagwar_attackers_members VALUES (?,?,?)";
  55. private static final String SQL_LOAD_MEMEBERS = "SELECT object_id FROM siegable_hall_flagwar_attackers_members WHERE clan_id = ?";
  56. private static final String SQL_SAVE_CLAN = "INSERT INTO siegable_hall_flagwar_attackers VALUES(?,?,?,?)";
  57. private static final String SQL_SAVE_NPC = "UPDATE siegable_hall_flagwar_attackers SET npc = ? WHERE clan_id = ?";
  58. private static final String SQL_CLEAR_CLAN = "DELETE FROM siegable_hall_flagwar_attackers WHERE hall_id = ?";
  59. private static final String SQL_CLEAR_CLAN_ATTACKERS = "DELETE FROM siegable_hall_flagwar_attackers_members WHERE hall_id = ?";
  60. protected static int ROYAL_FLAG;
  61. protected static int FLAG_RED;
  62. protected static int FLAG_YELLOW;
  63. protected static int FLAG_GREEN;
  64. protected static int FLAG_BLUE;
  65. protected static int FLAG_PURPLE;
  66. protected static int ALLY_1;
  67. protected static int ALLY_2;
  68. protected static int ALLY_3;
  69. protected static int ALLY_4;
  70. protected static int ALLY_5;
  71. protected static int TELEPORT_1;
  72. protected static int MESSENGER;
  73. protected static int[] OUTTER_DOORS_TO_OPEN = new int[2];
  74. protected static int[] INNER_DOORS_TO_OPEN = new int[2];
  75. protected static Location[] FLAG_COORDS = new Location[7];
  76. protected static L2ResidenceHallTeleportZone[] TELE_ZONES = new L2ResidenceHallTeleportZone[6];
  77. protected static int QUEST_REWARD;
  78. protected static L2CharPosition CENTER;
  79. protected TIntObjectHashMap<ClanData> _data = new TIntObjectHashMap<ClanData>(6);
  80. protected L2Clan _winner;
  81. private boolean _firstPhase;
  82. public FlagWar(int questId, String name, String descr, int hallId)
  83. {
  84. super(questId, name, descr, hallId);
  85. addStartNpc(MESSENGER);
  86. addFirstTalkId(MESSENGER);
  87. addTalkId(MESSENGER);
  88. for(int i = 0; i < 6; i++)
  89. addFirstTalkId(TELEPORT_1 + i);
  90. addKillId(ALLY_1);
  91. addKillId(ALLY_2);
  92. addKillId(ALLY_3);
  93. addKillId(ALLY_4);
  94. addKillId(ALLY_5);
  95. addSpawnId(ALLY_1);
  96. addSpawnId(ALLY_2);
  97. addSpawnId(ALLY_3);
  98. addSpawnId(ALLY_4);
  99. addSpawnId(ALLY_5);
  100. // If siege ends w/ more than 1 flag alive, winner is old owner
  101. _winner = ClanTable.getInstance().getClan(_hall.getOwnerId());
  102. }
  103. @Override
  104. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  105. {
  106. String html = null;
  107. /*
  108. if(player.getQuestState(qn) == null)
  109. newQuestState(player);
  110. */
  111. if(npc.getNpcId() == MESSENGER)
  112. {
  113. if(!checkIsAttacker(player.getClan()))
  114. {
  115. L2Clan clan = ClanTable.getInstance().getClan(_hall.getOwnerId());
  116. String content = HtmCache.getInstance().getHtm(null, "data/scripts/conquerablehalls/flagwar/"+qn+"/messenger_initial.htm");
  117. content = content.replaceAll("%clanName%", clan == null? "no owner" : clan.getName());
  118. content = content.replaceAll("%objectId%", String.valueOf(npc.getObjectId()));
  119. html = content;
  120. }
  121. else
  122. html = "messenger_initial.htm";
  123. }
  124. else
  125. {
  126. int index = npc.getNpcId() - TELEPORT_1;
  127. if(index == 0 && _firstPhase)
  128. html = "teleporter_notyet.htm";
  129. else
  130. {
  131. TELE_ZONES[index].checkTeleporTask();
  132. html = "teleporter.htm";
  133. }
  134. }
  135. return html;
  136. }
  137. @Override
  138. public synchronized String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  139. {
  140. String html = event;
  141. L2Clan clan = player.getClan();
  142. if(event.startsWith("register_clan")) // Register the clan for the siege
  143. {
  144. if(!_hall.isRegistering())
  145. {
  146. if(_hall.isInSiege())
  147. html = "messenger_registrationpassed.htm";
  148. else
  149. {
  150. sendRegistrationPageDate(player);
  151. return null;
  152. }
  153. }
  154. else if(clan == null || !player.isClanLeader())
  155. html = "messenger_notclannotleader.htm";
  156. else if(getAttackers().size() >= 5)
  157. html = "messenger_attackersqueuefull.htm";
  158. else if(checkIsAttacker(clan))
  159. html = "messenger_clanalreadyregistered.htm";
  160. else if(_hall.getOwnerId() == clan.getClanId())
  161. html = "messenger_curownermessage.htm";
  162. else
  163. {
  164. String[] arg = event.split(" ");
  165. if(arg.length >= 2)
  166. {
  167. // Register passing the quest
  168. if(arg[1].equals("wQuest"))
  169. {
  170. if(player.destroyItemByItemId(_hall.getName()+" Siege", QUEST_REWARD, 1, npc, false)) // Quest passed
  171. {
  172. registerClan(clan);
  173. html = getFlagHtml(_data.get(clan.getClanId()).flag);
  174. }
  175. else // Quest not accomplished, try by paying
  176. html = "messenger_noquest.htm";
  177. }
  178. // Register paying the fee
  179. else if(arg[1].equals("wFee") && canPayRegistration())
  180. {
  181. if(player.reduceAdena(qn+" Siege", 200000, npc, false)) // Fee payed
  182. {
  183. registerClan(clan);
  184. html = getFlagHtml(_data.get(clan.getClanId()).flag);
  185. }
  186. else // Fee couldnt be payed, try with quest
  187. html = "messenger_nomoney.htm";
  188. }
  189. }
  190. }
  191. }
  192. // Select the flag to defend
  193. else if(event.startsWith("select_clan_npc"))
  194. {
  195. if(!player.isClanLeader())
  196. html = "messenger_onlyleaderselectally.htm";
  197. else if(!_data.containsKey(clan.getClanId()))
  198. html = "messenger_clannotregistered.htm";
  199. else
  200. {
  201. String[] var = event.split(" ");
  202. if(var.length >= 2)
  203. {
  204. int id = 0;
  205. try { id = Integer.parseInt(var[1]); }
  206. catch(Exception e)
  207. {
  208. _log.warning(qn+"->select_clan_npc->Wrong mahum warrior id: "+var[1]);
  209. }
  210. if(id > 0 && (html = getAllyHtml(id)) != null)
  211. {
  212. _data.get(clan.getClanId()).npc = id;
  213. saveNpc(id, clan.getClanId());
  214. }
  215. }
  216. else
  217. _log.warning(qn+" Siege: Not enough parameters to save clan npc for clan: "+clan.getName());
  218. }
  219. }
  220. // View (and change ? ) the current selected mahum warrior
  221. else if(event.startsWith("view_clan_npc"))
  222. {
  223. ClanData cd = null;
  224. if(clan == null)
  225. html = "messenger_clannotregistered.htm";
  226. else if((cd = _data.get(clan.getClanId())) == null)
  227. html = "messenger_notclannotleader.htm";
  228. else if(cd.npc == 0)
  229. html = "messenger_leaderdidnotchooseyet.htm";
  230. else
  231. html = getAllyHtml(cd.npc);
  232. }
  233. // Register a clan member for the fight
  234. else if(event.equals("register_member"))
  235. {
  236. if(clan == null)
  237. html = "messenger_clannotregistered.htm";
  238. else if(!_hall.isRegistering())
  239. html = "messenger_registrationpassed.htm";
  240. else if(!_data.containsKey(clan.getClanId()))
  241. html = "messenger_notclannotleader.htm";
  242. else if(_data.get(clan.getClanId()).players.size() >= 18)
  243. html = "messenger_clanqueuefull.htm";
  244. else
  245. {
  246. ClanData data = _data.get(clan.getClanId());
  247. data.players.add(player.getObjectId());
  248. saveMember(clan.getClanId(), player.getObjectId());
  249. if(data.npc == 0)
  250. html = "messenger_leaderdidnotchooseyet.htm";
  251. else
  252. html = "messenger_clanregistered.htm";
  253. }
  254. }
  255. // Show cur attacker list
  256. else if(event.equals("view_attacker_list"))
  257. {
  258. if(_hall.isRegistering())
  259. sendRegistrationPageDate(player);
  260. else
  261. {
  262. html = HtmCache.getInstance().getHtm(null, "data/scripts/conquerablehalls/flagwar/"+qn+"/messenger_registeredclans.htm");
  263. for(int i = 0; i < _data.size(); i++)
  264. {
  265. L2Clan attacker = ClanTable.getInstance().getClan(_data.keys()[i]);
  266. if(attacker == null)
  267. continue;
  268. html = html.replaceAll("%clan"+i+"%", clan.getName());
  269. html = html.replaceAll("%clanMem"+i+"%", String.valueOf(_data.values()[i].players.size()));
  270. }
  271. if(_data.size() < 5)
  272. {
  273. for(int i = _data.size(); i < 5; i++)
  274. {
  275. html = html.replaceAll("%clan"+i+"%", "Empty pos. ");
  276. html = html.replaceAll("%clanMem"+i+"%", "Empty pos. ");
  277. }
  278. }
  279. }
  280. }
  281. return html;
  282. }
  283. @Override
  284. public synchronized String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
  285. {
  286. if(_hall.isInSiege())
  287. {
  288. final int npcId = npc.getNpcId();
  289. for(int keys : _data.keys())
  290. if(_data.get(keys).npc == npcId)
  291. removeParticipant(keys, true);
  292. _data.trimToSize();
  293. synchronized(this)
  294. {
  295. if(_firstPhase)
  296. {
  297. // Siege ends if just 1 flag is alive
  298. if((_data.size() == 1 && _hall.getOwnerId() <= 0) // Hall was free before battle
  299. || _data.values()[0].npc == 0) // or owner didnt set the ally npc
  300. {
  301. _missionAccomplished = true;
  302. _winner = ClanTable.getInstance().getClan(_data.keys()[0]);
  303. removeParticipant(_data.keys()[0], false);
  304. cancelSiegeTask();
  305. endSiege();
  306. }
  307. else if(_data.size() == 2 && _hall.getOwnerId() > 0) // Hall has defender (owner)
  308. {
  309. cancelSiegeTask(); // No time limit now
  310. _firstPhase = false;
  311. _hall.getSiegeZone().setIsActive(false);
  312. for(int doorId : INNER_DOORS_TO_OPEN)
  313. _hall.openCloseDoor(doorId, true);
  314. for(ClanData data : _data.values())
  315. doUnSpawns(data);
  316. ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
  317. {
  318. @Override
  319. public void run()
  320. {
  321. for(int doorId : INNER_DOORS_TO_OPEN)
  322. _hall.openCloseDoor(doorId, false);
  323. for(int i = 0; i< _data.size(); i++)
  324. doSpawns(_data.keys()[i], _data.values()[i]);
  325. _hall.getSiegeZone().setIsActive(true);
  326. }
  327. }, 300000);
  328. }
  329. }
  330. else
  331. {
  332. _missionAccomplished = true;
  333. _winner = ClanTable.getInstance().getClan(_data.keys()[0]);
  334. removeParticipant(_data.keys()[0], false);
  335. endSiege();
  336. }
  337. }
  338. }
  339. return null;
  340. }
  341. @Override
  342. public String onSpawn(L2Npc npc)
  343. {
  344. npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, CENTER);
  345. return null;
  346. }
  347. @Override
  348. public L2Clan getWinner()
  349. {
  350. return _winner;
  351. }
  352. @Override
  353. public void prepareOwner()
  354. {
  355. if(_hall.getOwnerId() > 0)
  356. registerClan(ClanTable.getInstance().getClan(_hall.getOwnerId()));
  357. _hall.banishForeigners();
  358. SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.REGISTRATION_TERM_FOR_S1_ENDED);
  359. msg.addString(getName());
  360. Announcements.getInstance().announceToAll(msg);
  361. _hall.updateSiegeStatus(SiegeStatus.WAITING_BATTLE);
  362. _siegeTask = ThreadPoolManager.getInstance().scheduleGeneral(new SiegeStarts(), 3600000);
  363. }
  364. @Override
  365. public void startSiege()
  366. {
  367. if(getAttackers().size() < 2)
  368. {
  369. onSiegeEnds();
  370. getAttackers().clear();
  371. _hall.updateNextSiege();
  372. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SIEGE_OF_S1_HAS_BEEN_CANCELED_DUE_TO_LACK_OF_INTEREST);
  373. sm.addString(_hall.getName());
  374. Announcements.getInstance().announceToAll(sm);
  375. return;
  376. }
  377. // Open doors for challengers
  378. for(int door : OUTTER_DOORS_TO_OPEN)
  379. _hall.openCloseDoor(door, true);
  380. // Teleport owner inside
  381. if(_hall.getOwnerId() > 0)
  382. {
  383. L2Clan owner = ClanTable.getInstance().getClan(_hall.getOwnerId());
  384. final Location loc = _hall.getZone().getSpawns().get(0); // Owner restart point
  385. for(L2ClanMember pc : owner.getMembers())
  386. {
  387. if(pc != null)
  388. {
  389. final L2PcInstance player = pc.getPlayerInstance();
  390. if(player != null && player.isOnline())
  391. player.teleToLocation(loc, false);
  392. }
  393. }
  394. }
  395. // Schedule open doors closement and siege start in 2 minutes
  396. ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
  397. {
  398. @Override
  399. public void run()
  400. {
  401. for(int door : OUTTER_DOORS_TO_OPEN)
  402. _hall.openCloseDoor(door, false);
  403. _hall.getZone().banishNonSiegeParticipants();
  404. FlagWar.super.startSiege();
  405. }
  406. }, 300000);
  407. }
  408. @Override
  409. public void onSiegeStarts()
  410. {
  411. for(int i = 1; i < _data.size(); i++)
  412. {
  413. // Spawns challengers flags and npcs
  414. try
  415. {
  416. ClanData data = _data.values()[i];
  417. doSpawns(_data.keys()[i], data);
  418. fillPlayerList(data);
  419. }
  420. catch(Exception e)
  421. {
  422. endSiege();
  423. _log.warning(qn+": Problems in siege initialization!");
  424. e.printStackTrace();
  425. }
  426. }
  427. }
  428. @Override
  429. public void endSiege()
  430. {
  431. if(_hall.getOwnerId() > 0)
  432. {
  433. L2Clan clan = ClanTable.getInstance().getClan(_hall.getOwnerId());
  434. clan.setHideoutId(0);
  435. _hall.free();
  436. }
  437. super.endSiege();
  438. }
  439. @Override
  440. public void onSiegeEnds()
  441. {
  442. if(_data.size() > 0)
  443. {
  444. for(int clanId : _data.keys())
  445. {
  446. if(_hall.getOwnerId() == clanId)
  447. removeParticipant(clanId, false);
  448. else
  449. removeParticipant(clanId, true);
  450. }
  451. }
  452. clearTables();
  453. }
  454. @Override
  455. public final Location getInnerSpawnLoc(final L2PcInstance player)
  456. {
  457. Location loc = null;
  458. if(player.getClanId() == _hall.getOwnerId())
  459. loc = _hall.getZone().getSpawns().get(0);
  460. else
  461. {
  462. ClanData cd = _data.get(player.getClanId());
  463. if(cd != null)
  464. {
  465. int index = cd.flag - FLAG_RED;
  466. if(index >= 0 && index <= 4)
  467. loc = _hall.getZone().getChallengerSpawns().get(index);
  468. else
  469. throw new ArrayIndexOutOfBoundsException();
  470. }
  471. }
  472. return loc;
  473. }
  474. @Override
  475. public final boolean canPlantFlag()
  476. {
  477. return false;
  478. }
  479. @Override
  480. public final boolean doorIsAutoAttackable()
  481. {
  482. return false;
  483. }
  484. private void doSpawns(int clanId, ClanData data)
  485. {
  486. try
  487. {
  488. L2NpcTemplate mahumTemplate = NpcTable.getInstance().getTemplate(data.npc);
  489. L2NpcTemplate flagTemplate = NpcTable.getInstance().getTemplate(data.flag);
  490. if(flagTemplate == null)
  491. {
  492. _log.warning(qn+": Flag L2NpcTemplate["+data.flag+"] does not exist!");
  493. throw new NullPointerException();
  494. }
  495. else if(mahumTemplate == null)
  496. {
  497. _log.warning(qn+": Ally L2NpcTemplate["+data.npc+"] does not exist!");
  498. throw new NullPointerException();
  499. }
  500. int index = 0;
  501. if(_firstPhase)
  502. index = data.flag - FLAG_RED;
  503. else
  504. index = clanId == _hall.getOwnerId()? 5 : 6;
  505. Location loc = FLAG_COORDS[index];
  506. data.flagInstance = new L2Spawn(flagTemplate);
  507. data.flagInstance.setLocation(loc);
  508. data.flagInstance.setRespawnDelay(10000);
  509. data.flagInstance.setAmount(1);
  510. data.flagInstance.init();
  511. data.warrior = new L2Spawn(mahumTemplate);
  512. data.warrior.setLocation(loc);
  513. data.warrior.setRespawnDelay(10000);
  514. data.warrior.setAmount(1);
  515. data.warrior.init();
  516. ((L2SpecialSiegeGuardAI)data.warrior.getLastSpawn().getAI()).getAlly().addAll(data.players);
  517. }
  518. catch(Exception e)
  519. {
  520. _log.warning(qn+": Couldnt make clan spawns: "+e.getMessage());
  521. e.printStackTrace();
  522. }
  523. }
  524. private void fillPlayerList(ClanData data)
  525. {
  526. for(int objId : data.players)
  527. {
  528. L2PcInstance plr = L2World.getInstance().getPlayer(objId);
  529. if(plr != null)
  530. {
  531. data.playersInstance.add(plr);
  532. }
  533. }
  534. }
  535. private void registerClan(L2Clan clan)
  536. {
  537. final int clanId = clan.getClanId();
  538. L2SiegeClan sc = new L2SiegeClan(clanId, SiegeClanType.ATTACKER);
  539. getAttackers().put(clanId, sc);
  540. ClanData data = new ClanData();
  541. data.flag = ROYAL_FLAG + _data.size();
  542. data.players.add(clan.getLeaderId());
  543. _data.put(clanId, data);
  544. saveClan(clanId, data.flag);
  545. saveMember(clanId, clan.getLeaderId());
  546. }
  547. private final void doUnSpawns(ClanData data)
  548. {
  549. if(data.flagInstance != null)
  550. {
  551. data.flagInstance.stopRespawn();
  552. data.flagInstance.getLastSpawn().deleteMe();
  553. }
  554. if(data.warrior != null)
  555. {
  556. data.warrior.stopRespawn();
  557. data.warrior.getLastSpawn().deleteMe();
  558. }
  559. }
  560. private final void removeParticipant(int clanId, boolean teleport)
  561. {
  562. ClanData dat = _data.remove(clanId);
  563. if(dat != null)
  564. {
  565. // Destroy clan flag
  566. if(dat.flagInstance != null)
  567. {
  568. dat.flagInstance.stopRespawn();
  569. if(dat.flagInstance.getLastSpawn() != null)
  570. dat.flagInstance.getLastSpawn().deleteMe();
  571. }
  572. if(dat.warrior != null)
  573. {
  574. // Destroy clan warrior
  575. dat.warrior.stopRespawn();
  576. if(dat.warrior.getLastSpawn() != null)
  577. dat.warrior.getLastSpawn().deleteMe();
  578. }
  579. dat.players.clear();
  580. if(teleport)
  581. {
  582. // Teleport players outside
  583. for(L2PcInstance pc : dat.playersInstance)
  584. if(pc != null)
  585. pc.teleToLocation(TeleportWhereType.Town);
  586. }
  587. dat.playersInstance.clear();
  588. }
  589. }
  590. public boolean canPayRegistration()
  591. {
  592. return true;
  593. }
  594. private void sendRegistrationPageDate(L2PcInstance player)
  595. {
  596. NpcHtmlMessage msg = new NpcHtmlMessage(5);
  597. msg.setFile(null, "data/scripts/conquerablehalls/flagwar/"+qn+"/siege_date.htm");
  598. msg.replace("%nextSiege%", _hall.getSiegeDate().getTime().toString());
  599. player.sendPacket(msg);
  600. }
  601. public abstract String getFlagHtml(int flag);
  602. public abstract String getAllyHtml(int ally);
  603. // =============================================
  604. // Database access methods
  605. // =============================================
  606. @Override
  607. public final void loadAttackers()
  608. {
  609. Connection con = null;
  610. try
  611. {
  612. con = L2DatabaseFactory.getInstance().getConnection();
  613. PreparedStatement statement = con.prepareStatement(SQL_LOAD_ATTACKERS);
  614. statement.setInt(1, _hall.getId());
  615. ResultSet rset = statement.executeQuery();
  616. while(rset.next())
  617. {
  618. final int clanId = rset.getInt("clan_id");
  619. if(ClanTable.getInstance().getClan(clanId) == null)
  620. {
  621. _log.warning(qn+": Loaded an unexistent clan as attacker! Clan Id: "+clanId);
  622. continue;
  623. }
  624. ClanData data = new ClanData();
  625. data.flag = rset.getInt("flag");
  626. data.npc = rset.getInt("npc");
  627. _data.put(clanId, data);
  628. loadAttackerMembers(clanId);
  629. }
  630. rset.close();
  631. statement.close();
  632. }
  633. catch(Exception e)
  634. {
  635. _log.warning(qn+".loadAttackers()->"+e.getMessage());
  636. e.printStackTrace();
  637. }
  638. finally
  639. {
  640. L2DatabaseFactory.close(con);
  641. }
  642. }
  643. private final void loadAttackerMembers(int clanId)
  644. {
  645. Connection con = null;
  646. try
  647. {
  648. ArrayList<Integer> listInstance = _data.get(clanId).players;
  649. if(listInstance == null)
  650. {
  651. _log.warning(qn+": Tried to load unregistered clan: "+clanId+"[clan Id]");
  652. return;
  653. }
  654. con = L2DatabaseFactory.getInstance().getConnection();
  655. PreparedStatement statement = con.prepareStatement(SQL_LOAD_MEMEBERS);
  656. statement.setInt(1, clanId);
  657. ResultSet rset = statement.executeQuery();
  658. while(rset.next())
  659. {
  660. listInstance.add(rset.getInt("object_id"));
  661. }
  662. rset.close();
  663. statement.close();
  664. }
  665. catch(Exception e)
  666. {
  667. _log.warning(qn+".loadAttackerMembers()->"+e.getMessage());
  668. e.printStackTrace();
  669. }
  670. finally
  671. {
  672. L2DatabaseFactory.close(con);
  673. }
  674. }
  675. private final void saveClan(int clanId, int flag)
  676. {
  677. Connection con = null;
  678. try
  679. {
  680. con = L2DatabaseFactory.getInstance().getConnection();
  681. PreparedStatement statement = con.prepareStatement(SQL_SAVE_CLAN);
  682. statement.setInt(1, _hall.getId());
  683. statement.setInt(2, flag);
  684. statement.setInt(3, 0);
  685. statement.setInt(4, clanId);
  686. statement.execute();
  687. statement.close();
  688. }
  689. catch(Exception e)
  690. {
  691. _log.warning(qn+".saveClan()->"+e.getMessage());
  692. e.printStackTrace();
  693. }
  694. finally
  695. {
  696. L2DatabaseFactory.close(con);
  697. }
  698. }
  699. private final void saveNpc(int npc, int clanId)
  700. {
  701. Connection con = null;
  702. try
  703. {
  704. con = L2DatabaseFactory.getInstance().getConnection();
  705. PreparedStatement statement = con.prepareStatement(SQL_SAVE_NPC);
  706. statement.setInt(1, npc);
  707. statement.setInt(2, clanId);
  708. statement.execute();
  709. statement.close();
  710. }
  711. catch(Exception e)
  712. {
  713. _log.warning(qn+".saveNpc()->"+e.getMessage());
  714. e.printStackTrace();
  715. }
  716. finally
  717. {
  718. L2DatabaseFactory.close(con);
  719. }
  720. }
  721. private final void saveMember(int clanId, int objectId)
  722. {
  723. Connection con = null;
  724. try
  725. {
  726. con = L2DatabaseFactory.getInstance().getConnection();
  727. PreparedStatement statement = con.prepareStatement(SQL_SAVE_ATTACKER);
  728. statement.setInt(1, _hall.getId());
  729. statement.setInt(2, clanId);
  730. statement.setInt(3, objectId);
  731. statement.execute();
  732. statement.close();
  733. }
  734. catch(Exception e)
  735. {
  736. _log.warning(qn+".saveMember()->"+e.getMessage());
  737. e.printStackTrace();
  738. }
  739. finally
  740. {
  741. L2DatabaseFactory.close(con);
  742. }
  743. }
  744. private void clearTables()
  745. {
  746. Connection con = null;
  747. try
  748. {
  749. con = L2DatabaseFactory.getInstance().getConnection();
  750. PreparedStatement stat1 = con.prepareStatement(SQL_CLEAR_CLAN);
  751. stat1.setInt(1, _hall.getId());
  752. stat1.execute();
  753. stat1.close();
  754. PreparedStatement stat2 = con.prepareStatement(SQL_CLEAR_CLAN_ATTACKERS);
  755. stat2.setInt(1, _hall.getId());
  756. stat2.execute();
  757. stat2.close();
  758. }
  759. catch(Exception e)
  760. {
  761. _log.warning(qn+".clearTables()->"+e.getMessage());
  762. e.printStackTrace();
  763. }
  764. finally
  765. {
  766. L2DatabaseFactory.close(con);
  767. }
  768. }
  769. class ClanData
  770. {
  771. int flag = 0;
  772. int npc = 0;
  773. ArrayList<Integer> players = new ArrayList<Integer>(18);
  774. ArrayList<L2PcInstance> playersInstance = new ArrayList<L2PcInstance>(18);
  775. L2Spawn warrior = null;
  776. L2Spawn flagInstance = null;
  777. }
  778. }