FortSiege.java 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324
  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 com.l2jserver.gameserver.model.entity;
  16. import java.sql.Connection;
  17. import java.sql.PreparedStatement;
  18. import java.sql.ResultSet;
  19. import java.util.Calendar;
  20. import java.util.Collection;
  21. import java.util.List;
  22. import java.util.concurrent.ScheduledFuture;
  23. import java.util.logging.Logger;
  24. import com.l2jserver.Config;
  25. import com.l2jserver.L2DatabaseFactory;
  26. import com.l2jserver.gameserver.ThreadPoolManager;
  27. import com.l2jserver.gameserver.datatables.ClanTable;
  28. import com.l2jserver.gameserver.datatables.MapRegionTable;
  29. import com.l2jserver.gameserver.datatables.NpcTable;
  30. import com.l2jserver.gameserver.instancemanager.FortManager;
  31. import com.l2jserver.gameserver.instancemanager.FortSiegeGuardManager;
  32. import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
  33. import com.l2jserver.gameserver.instancemanager.FortSiegeManager.SiegeSpawn;
  34. import com.l2jserver.gameserver.model.CombatFlag;
  35. import com.l2jserver.gameserver.model.L2Clan;
  36. import com.l2jserver.gameserver.model.L2Object;
  37. import com.l2jserver.gameserver.model.L2SiegeClan;
  38. import com.l2jserver.gameserver.model.L2Spawn;
  39. import com.l2jserver.gameserver.model.L2SiegeClan.SiegeClanType;
  40. import com.l2jserver.gameserver.model.actor.L2Npc;
  41. import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
  42. import com.l2jserver.gameserver.model.actor.instance.L2FortCommanderInstance;
  43. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  44. import com.l2jserver.gameserver.network.SystemMessageId;
  45. import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
  46. import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  47. import com.l2jserver.gameserver.network.serverpackets.RelationChanged;
  48. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  49. import com.l2jserver.gameserver.network.serverpackets.UserInfo;
  50. import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
  51. import javolution.util.FastList;
  52. import javolution.util.FastMap;
  53. public class FortSiege implements Siegable
  54. {
  55. protected static final Logger _log = Logger.getLogger(FortSiege.class.getName());
  56. public static enum TeleportWhoType
  57. {
  58. All,
  59. Attacker,
  60. Owner,
  61. }
  62. public class ScheduleEndSiegeTask implements Runnable
  63. {
  64. private final Fort _fortInst;
  65. public ScheduleEndSiegeTask(Fort pFort)
  66. {
  67. _fortInst = pFort;
  68. }
  69. public void run()
  70. {
  71. if (!getIsInProgress())
  72. return;
  73. try
  74. {
  75. _siegeEnd = null;
  76. _fortInst.getSiege().endSiege();
  77. }
  78. catch (Exception e)
  79. {
  80. _log.warning("Exception: ScheduleEndSiegeTask() for Fort: "+_fortInst.getName()+" " + e.getMessage());
  81. e.printStackTrace();
  82. }
  83. }
  84. }
  85. public class ScheduleStartSiegeTask implements Runnable
  86. {
  87. private final Fort _fortInst;
  88. private final int _time;
  89. public ScheduleStartSiegeTask(Fort pFort, int time)
  90. {
  91. _fortInst = pFort;
  92. _time = time;
  93. }
  94. public void run()
  95. {
  96. if (getIsInProgress())
  97. return;
  98. try
  99. {
  100. final SystemMessage sm;
  101. if (_time == 3600) // 1hr remains
  102. {
  103. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,600), 3000000); // Prepare task for 10 minutes left.
  104. }
  105. else if (_time == 600) // 10min remains
  106. {
  107. getFort().despawnSuspiciousMerchant();
  108. sm = new SystemMessage(SystemMessageId.S1_MINUTES_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  109. sm.addNumber(10);
  110. announceToPlayer(sm);
  111. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,300), 300000); // Prepare task for 5 minutes left.
  112. }
  113. else if (_time == 300) // 5min remains
  114. {
  115. sm = new SystemMessage(SystemMessageId.S1_MINUTES_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  116. sm.addNumber(5);
  117. announceToPlayer(sm);
  118. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,60), 240000); // Prepare task for 1 minute left.
  119. }
  120. else if (_time == 60) // 1min remains
  121. {
  122. sm = new SystemMessage(SystemMessageId.S1_MINUTES_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  123. sm.addNumber(1);
  124. announceToPlayer(sm);
  125. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,30), 30000); // Prepare task for 30 seconds left.
  126. }
  127. else if (_time == 30) // 30seconds remains
  128. {
  129. sm = new SystemMessage(SystemMessageId.S1_SECONDS_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  130. sm.addNumber(30);
  131. announceToPlayer(sm);
  132. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,10), 20000); // Prepare task for 10 seconds left.
  133. }
  134. else if (_time == 10) // 10seconds remains
  135. {
  136. sm = new SystemMessage(SystemMessageId.S1_SECONDS_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  137. sm.addNumber(10);
  138. announceToPlayer(sm);
  139. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,5), 5000); // Prepare task for 5 seconds left.
  140. }
  141. else if (_time == 5) // 5seconds remains
  142. {
  143. sm = new SystemMessage(SystemMessageId.S1_SECONDS_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  144. sm.addNumber(5);
  145. announceToPlayer(sm);
  146. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,1), 4000); // Prepare task for 1 seconds left.
  147. }
  148. else if (_time == 1) // 1seconds remains
  149. {
  150. sm = new SystemMessage(SystemMessageId.S1_SECONDS_UNTIL_THE_FORTRESS_BATTLE_STARTS);
  151. sm.addNumber(1);
  152. announceToPlayer(sm);
  153. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStartSiegeTask(_fortInst,0), 1000); // Prepare task start siege.
  154. }
  155. else if (_time == 0)// start siege
  156. {
  157. _fortInst.getSiege().startSiege();
  158. }
  159. else
  160. _log.warning("Exception: ScheduleStartSiegeTask(): unknown siege time: "+String.valueOf(_time));
  161. }
  162. catch (Exception e)
  163. {
  164. _log.warning("Exception: ScheduleStartSiegeTask() for Fort: "+_fortInst.getName()+" " + e.getMessage());
  165. e.printStackTrace();
  166. }
  167. }
  168. }
  169. public class ScheduleSuspiciousMerchantSpawn implements Runnable
  170. {
  171. private final Fort _fortInst;
  172. public ScheduleSuspiciousMerchantSpawn(Fort pFort)
  173. {
  174. _fortInst = pFort;
  175. }
  176. public void run()
  177. {
  178. if (getIsInProgress())
  179. return;
  180. try
  181. {
  182. _fortInst.spawnSuspiciousMerchant();
  183. }
  184. catch (Exception e)
  185. {
  186. _log.warning("Exception: ScheduleSuspicoiusMerchantSpawn() for Fort: "+_fortInst.getName()+" " + e.getMessage());
  187. e.printStackTrace();
  188. }
  189. }
  190. }
  191. public class ScheduleSiegeRestore implements Runnable
  192. {
  193. private final Fort _fortInst;
  194. public ScheduleSiegeRestore(Fort pFort)
  195. {
  196. _fortInst = pFort;
  197. }
  198. public void run()
  199. {
  200. if (!getIsInProgress())
  201. return;
  202. try
  203. {
  204. _siegeRestore = null;
  205. _fortInst.getSiege().resetSiege();
  206. announceToPlayer(new SystemMessage(SystemMessageId.BARRACKS_FUNCTION_RESTORED));
  207. }
  208. catch (Exception e)
  209. {
  210. _log.warning("Exception: ScheduleSiegeRestore() for Fort: "+_fortInst.getName()+" " + e.getMessage());
  211. e.printStackTrace();
  212. }
  213. }
  214. }
  215. private List<L2SiegeClan> _attackerClans = new FastList<L2SiegeClan>();
  216. // Fort setting
  217. protected FastMap<Integer, FastList<L2Spawn>> _commanders = new FastMap<Integer, FastList<L2Spawn>>();
  218. protected FastList<L2Spawn> _commandersSpawns;
  219. private final Fort[] _fort;
  220. private boolean _isInProgress = false;
  221. private FortSiegeGuardManager _siegeGuardManager;
  222. ScheduledFuture<?> _siegeEnd = null;
  223. ScheduledFuture<?> _siegeRestore = null;
  224. ScheduledFuture<?> _siegeStartTask = null;
  225. public FortSiege(Fort[] fort)
  226. {
  227. _fort = fort;
  228. checkAutoTask();
  229. FortSiegeManager.getInstance().addSiege(this);
  230. }
  231. /**
  232. * When siege ends<BR><BR>
  233. */
  234. public void endSiege()
  235. {
  236. if (getIsInProgress())
  237. {
  238. _isInProgress = false; // Flag so that siege instance can be started
  239. final SystemMessage sm = new SystemMessage(SystemMessageId.THE_FORTRESS_BATTLE_OF_S1_HAS_FINISHED);
  240. sm.addFortId(getFort().getFortId());
  241. announceToPlayer(sm);
  242. removeFlags(); // Removes all flags. Note: Remove flag before teleporting players
  243. unSpawnFlags();
  244. updatePlayerSiegeStateFlags(true);
  245. getFort().getZone().banishForeigners(getFort().getOwnerClan());
  246. getFort().getZone().setIsActive(false);
  247. getFort().getZone().updateZoneStatusForCharactersInside();
  248. saveFortSiege(); // Save fort specific data
  249. clearSiegeClan(); // Clear siege clan from db
  250. removeCommanders(); // Remove commander from this fort
  251. getFort().spawnNpcCommanders(); // Spawn NPC commanders
  252. getSiegeGuardManager().unspawnSiegeGuard(); // Remove all spawned siege guard from this fort
  253. getFort().resetDoors(); // Respawn door to fort
  254. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSuspiciousMerchantSpawn(getFort()), FortSiegeManager.getInstance().getSuspiciousMerchantRespawnDelay()*60*1000); // Prepare 3hr task for suspicious merchant respawn
  255. setSiegeDateTime(true); // store suspicious merchant spawn in DB
  256. if (_siegeEnd != null)
  257. _siegeEnd.cancel(true);
  258. if (_siegeRestore != null)
  259. _siegeRestore.cancel(true);
  260. if (getFort().getOwnerClan() != null && getFort().getFlagPole().getMeshIndex() == 0)
  261. getFort().setVisibleFlag(true);
  262. _log.info("Siege of " + getFort().getName() + " fort finished.");
  263. }
  264. }
  265. /**
  266. * When siege starts<BR><BR>
  267. */
  268. public void startSiege()
  269. {
  270. if (!getIsInProgress())
  271. {
  272. if (_siegeStartTask != null) // used admin command "admin_startfortsiege"
  273. {
  274. _siegeStartTask.cancel(true);
  275. getFort().despawnSuspiciousMerchant();
  276. }
  277. _siegeStartTask = null;
  278. if (getAttackerClans().isEmpty())
  279. return;
  280. _isInProgress = true; // Flag so that same siege instance cannot be started again
  281. loadSiegeClan(); // Load siege clan from db
  282. updatePlayerSiegeStateFlags(false);
  283. teleportPlayer(FortSiege.TeleportWhoType.Attacker, MapRegionTable.TeleportWhereType.Town); // Teleport to the closest town
  284. getFort().despawnNpcCommanders(); // Despawn NPC commanders
  285. spawnCommanders(); // Spawn commanders
  286. getFort().resetDoors(); // Spawn door
  287. spawnSiegeGuard(); // Spawn siege guard
  288. getFort().setVisibleFlag(false);
  289. getFort().getZone().setIsActive(true);
  290. getFort().getZone().updateZoneStatusForCharactersInside();
  291. // Schedule a task to prepare auto siege end
  292. _siegeEnd = ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEndSiegeTask(getFort()), FortSiegeManager.getInstance().getSiegeLength()*60*1000); // Prepare auto end task
  293. final SystemMessage sm = new SystemMessage(SystemMessageId.THE_FORTRESS_BATTLE_S1_HAS_BEGUN);
  294. sm.addFortId(getFort().getFortId());
  295. announceToPlayer(sm);
  296. saveFortSiege();
  297. _log.info("Siege of " + getFort().getName() + " fort started.");
  298. }
  299. }
  300. /**
  301. * Announce to player.<BR><BR>
  302. * @param message The String of the message to send to player
  303. */
  304. public void announceToPlayer(SystemMessage sm)
  305. {
  306. // announce messages only for participants
  307. L2Clan clan;
  308. for (L2SiegeClan siegeclan : getAttackerClans())
  309. {
  310. clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
  311. for (L2PcInstance member : clan.getOnlineMembers(0))
  312. {
  313. if (member != null)
  314. member.sendPacket(sm);
  315. }
  316. }
  317. if (getFort().getOwnerClan() != null)
  318. {
  319. clan = ClanTable.getInstance().getClan(getFort().getOwnerClan().getClanId());
  320. for (L2PcInstance member : clan.getOnlineMembers(0))
  321. {
  322. if (member != null)
  323. member.sendPacket(sm);
  324. }
  325. }
  326. }
  327. public void announceToPlayer(SystemMessage sm, String s)
  328. {
  329. sm.addString(s);
  330. announceToPlayer(sm);
  331. }
  332. public void updatePlayerSiegeStateFlags(boolean clear)
  333. {
  334. L2Clan clan;
  335. for (L2SiegeClan siegeclan : getAttackerClans())
  336. {
  337. clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
  338. for (L2PcInstance member : clan.getOnlineMembers(0))
  339. {
  340. if (member == null)
  341. continue;
  342. if (clear)
  343. {
  344. member.setSiegeState((byte) 0);
  345. member.setSiegeSide(0);
  346. member.setIsInSiege(false);
  347. member.stopFameTask();
  348. }
  349. else
  350. {
  351. member.setSiegeState((byte) 1);
  352. member.setSiegeSide(getFort().getFortId());
  353. if (checkIfInZone(member))
  354. {
  355. member.setIsInSiege(true);
  356. member.startFameTask(Config.FORTRESS_ZONE_FAME_TASK_FREQUENCY * 1000, Config.FORTRESS_ZONE_FAME_AQUIRE_POINTS);
  357. }
  358. }
  359. member.sendPacket(new UserInfo(member));
  360. member.sendPacket(new ExBrExtraUserInfo(member));
  361. Collection<L2PcInstance> plrs = member.getKnownList().getKnownPlayers().values();
  362. //synchronized (member.getKnownList().getKnownPlayers())
  363. {
  364. for (L2PcInstance player : plrs)
  365. {
  366. try
  367. {
  368. player.sendPacket(new RelationChanged(member, member.getRelation(player), member.isAutoAttackable(player)));
  369. if (member.getPet() != null)
  370. player.sendPacket(new RelationChanged(member.getPet(), member.getRelation(player), member.isAutoAttackable(player)));
  371. }
  372. catch (NullPointerException e)
  373. {
  374. }
  375. }
  376. }
  377. }
  378. }
  379. if (getFort().getOwnerClan() != null)
  380. {
  381. clan = ClanTable.getInstance().getClan(getFort().getOwnerClan().getClanId());
  382. for (L2PcInstance member : clan.getOnlineMembers(0))
  383. {
  384. if (member == null)
  385. continue;
  386. if (clear)
  387. {
  388. member.setSiegeState((byte) 0);
  389. member.setSiegeSide(0);
  390. member.setIsInSiege(false);
  391. member.stopFameTask();
  392. }
  393. else
  394. {
  395. member.setSiegeState((byte) 2);
  396. member.setSiegeSide(getFort().getFortId());
  397. if (checkIfInZone(member))
  398. {
  399. member.setIsInSiege(true);
  400. member.startFameTask(Config.FORTRESS_ZONE_FAME_TASK_FREQUENCY * 1000, Config.FORTRESS_ZONE_FAME_AQUIRE_POINTS);
  401. }
  402. }
  403. member.sendPacket(new UserInfo(member));
  404. member.sendPacket(new ExBrExtraUserInfo(member));
  405. Collection<L2PcInstance> plrs = member.getKnownList().getKnownPlayers().values();
  406. //synchronized (member.getKnownList().getKnownPlayers())
  407. {
  408. for (L2PcInstance player : plrs)
  409. {
  410. try
  411. {
  412. player.sendPacket(new RelationChanged(member, member.getRelation(player), member.isAutoAttackable(player)));
  413. if (member.getPet() != null)
  414. player.sendPacket(new RelationChanged(member.getPet(), member.getRelation(player), member.isAutoAttackable(player)));
  415. }
  416. catch (NullPointerException e)
  417. {
  418. }
  419. }
  420. }
  421. }
  422. }
  423. }
  424. /** Return true if object is inside the zone */
  425. public boolean checkIfInZone(L2Object object)
  426. {
  427. return checkIfInZone(object.getX(), object.getY(), object.getZ());
  428. }
  429. /** Return true if object is inside the zone */
  430. public boolean checkIfInZone(int x, int y, int z)
  431. {
  432. return (getIsInProgress() && (getFort().checkIfInZone(x, y, z))); // Fort zone during siege
  433. }
  434. /**
  435. * Return true if clan is attacker<BR><BR>
  436. * @param clan The L2Clan of the player
  437. */
  438. public boolean checkIsAttacker(L2Clan clan)
  439. {
  440. return (getAttackerClan(clan) != null);
  441. }
  442. /**
  443. * Return true if clan is defender<BR><BR>
  444. * @param clan The L2Clan of the player
  445. */
  446. public boolean checkIsDefender(L2Clan clan)
  447. {
  448. if (clan != null && getFort().getOwnerClan() == clan)
  449. return true;
  450. return false;
  451. }
  452. /** Clear all registered siege clans from database for fort */
  453. public void clearSiegeClan()
  454. {
  455. Connection con = null;
  456. PreparedStatement statement = null;
  457. try
  458. {
  459. con = L2DatabaseFactory.getInstance().getConnection();
  460. statement = con.prepareStatement("DELETE FROM fortsiege_clans WHERE fort_id=?");
  461. statement.setInt(1, getFort().getFortId());
  462. statement.execute();
  463. statement.close();
  464. if (getFort().getOwnerClan() != null)
  465. {
  466. statement = con.prepareStatement("DELETE FROM fortsiege_clans WHERE clan_id=?");
  467. statement.setInt(1, getFort().getOwnerClan().getClanId());
  468. statement.execute();
  469. }
  470. getAttackerClans().clear();
  471. // if siege is in progress, end siege
  472. if (getIsInProgress())
  473. endSiege();
  474. // if siege isnt in progress (1hr waiting time till siege starts), cancel waiting time
  475. if (_siegeStartTask != null)
  476. {
  477. _siegeStartTask.cancel(true);
  478. _siegeStartTask = null;
  479. }
  480. }
  481. catch (Exception e)
  482. {
  483. _log.warning("Exception: clearSiegeClan(): " + e.getMessage());
  484. e.printStackTrace();
  485. }
  486. finally
  487. {
  488. try
  489. {
  490. statement.close();
  491. }
  492. catch (Exception e)
  493. {
  494. }
  495. try
  496. {
  497. con.close();
  498. }
  499. catch (Exception e)
  500. {
  501. }
  502. }
  503. }
  504. /** Set the date for the next siege. */
  505. private void clearSiegeDate()
  506. {
  507. getFort().getSiegeDate().setTimeInMillis(0);
  508. }
  509. /** Return list of L2PcInstance registered as attacker in the zone. */
  510. public List<L2PcInstance> getAttackersInZone()
  511. {
  512. List<L2PcInstance> players = new FastList<L2PcInstance>();
  513. L2Clan clan;
  514. for (L2SiegeClan siegeclan : getAttackerClans())
  515. {
  516. clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
  517. for (L2PcInstance player : clan.getOnlineMembers(0))
  518. {
  519. if (player == null)
  520. continue;
  521. if (player.isInSiege())
  522. players.add(player);
  523. }
  524. }
  525. return players;
  526. }
  527. /** Return list of L2PcInstance in the zone. */
  528. public List<L2PcInstance> getPlayersInZone()
  529. {
  530. return getFort().getZone().getAllPlayers();
  531. }
  532. /** Return list of L2PcInstance owning the fort in the zone. */
  533. public List<L2PcInstance> getOwnersInZone()
  534. {
  535. List<L2PcInstance> players = new FastList<L2PcInstance>();
  536. L2Clan clan;
  537. if (getFort().getOwnerClan() != null)
  538. {
  539. clan = ClanTable.getInstance().getClan(getFort().getOwnerClan().getClanId());
  540. if (clan != getFort().getOwnerClan())
  541. return null;
  542. for (L2PcInstance player : clan.getOnlineMembers(0))
  543. {
  544. if (player == null)
  545. continue;
  546. if (player.isInSiege())
  547. players.add(player);
  548. }
  549. }
  550. return players;
  551. }
  552. /** Commander was killed */
  553. public void killedCommander(L2FortCommanderInstance instance)
  554. {
  555. if (_commanders != null && getFort() != null && _commanders.get(getFort().getFortId()).size() != 0)
  556. {
  557. L2Spawn spawn = instance.getSpawn();
  558. if (spawn != null)
  559. {
  560. FastList<SiegeSpawn> commanders = FortSiegeManager.getInstance().getCommanderSpawnList(getFort().getFortId());
  561. for (SiegeSpawn spawn2 : commanders)
  562. {
  563. if (spawn2.getNpcId() == spawn.getNpcid())
  564. {
  565. String text = "";
  566. switch (spawn2.getId())
  567. {
  568. case 1:
  569. text = "You may have broken our arrows, but you will never break our will! Archers retreat!";
  570. break;
  571. case 2:
  572. text = "Aieeee! Command Center! This is guard unit! We need backup right away!";
  573. break;
  574. case 3:
  575. text = "At last! The Magic Field that protects the fortress has weakened! Volunteers, stand back!";
  576. break;
  577. case 4:
  578. text = "I feel so much grief that I can't even take care of myself. There isn't any reason for me to stay here any longer.";
  579. break;
  580. }
  581. if (!text.isEmpty())
  582. instance.broadcastPacket(new NpcSay(instance.getObjectId(), 1, instance.getNpcId(), text));
  583. }
  584. }
  585. _commanders.get(getFort().getFortId()).remove(spawn);
  586. if (_commanders.get(getFort().getFortId()).isEmpty())
  587. {
  588. // spawn fort flags
  589. spawnFlag(getFort().getFortId());
  590. // cancel door/commanders respawn
  591. if (_siegeRestore != null)
  592. {
  593. _siegeRestore.cancel(true);
  594. }
  595. // open doors in main building
  596. for (L2DoorInstance door : getFort().getDoors())
  597. {
  598. if (!door.getIsCommanderDoor())
  599. continue;
  600. door.openMe();
  601. }
  602. getFort().getSiege().announceToPlayer(new SystemMessage(SystemMessageId.ALL_BARRACKS_OCCUPIED));
  603. }
  604. // schedule restoring doors/commanders respawn
  605. else if (_siegeRestore == null)
  606. {
  607. getFort().getSiege().announceToPlayer(new SystemMessage(SystemMessageId.SEIZED_BARRACKS));
  608. _siegeRestore = ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSiegeRestore(getFort()), FortSiegeManager.getInstance().getCountDownLength()*60*1000);
  609. }
  610. else
  611. getFort().getSiege().announceToPlayer(new SystemMessage(SystemMessageId.SEIZED_BARRACKS));
  612. }
  613. else
  614. _log.warning("FortSiege.killedCommander(): killed commander, but commander not registered for fortress. NpcId: "+instance.getNpcId()+" FortId: "+getFort().getFortId());
  615. }
  616. }
  617. /** Remove the flag that was killed */
  618. public void killedFlag(L2Npc flag)
  619. {
  620. if (flag == null)
  621. return;
  622. for (L2SiegeClan clan: getAttackerClans())
  623. {
  624. if (clan.removeFlag(flag))
  625. return;
  626. }
  627. }
  628. /**
  629. * Register clan as attacker<BR><BR>
  630. * @param player The L2PcInstance of the player trying to register
  631. */
  632. public boolean registerAttacker(L2PcInstance player, boolean force)
  633. {
  634. if (player.getClan() == null)
  635. return false;
  636. if (force || checkIfCanRegister(player))
  637. {
  638. saveSiegeClan(player.getClan()); // Save to database
  639. // if the first registering we start the timer
  640. if (getAttackerClans().size() == 1)
  641. {
  642. if (!force)
  643. player.reduceAdena("siege", 250000, null, true);
  644. startAutoTask(true);
  645. }
  646. return true;
  647. }
  648. return false;
  649. }
  650. /**
  651. * Remove clan from siege<BR><BR>
  652. * This function does not do any checks and should not be called from bypass !
  653. * @param clanId The int of player's clan id
  654. */
  655. private void removeSiegeClan(int clanId)
  656. {
  657. Connection con = null;
  658. PreparedStatement statement = null;
  659. try
  660. {
  661. con = L2DatabaseFactory.getInstance().getConnection();
  662. if (clanId != 0)
  663. statement = con.prepareStatement("DELETE FROM fortsiege_clans WHERE fort_id=? AND clan_id=?");
  664. else
  665. statement = con.prepareStatement("DELETE FROM fortsiege_clans WHERE fort_id=?");
  666. statement.setInt(1, getFort().getFortId());
  667. if (clanId != 0)
  668. statement.setInt(2, clanId);
  669. statement.execute();
  670. loadSiegeClan();
  671. if (getAttackerClans().isEmpty())
  672. {
  673. if (getIsInProgress())
  674. endSiege();
  675. else
  676. saveFortSiege(); // Clear siege time in DB
  677. if (_siegeStartTask != null)
  678. {
  679. _siegeStartTask.cancel(true);
  680. _siegeStartTask = null;
  681. }
  682. }
  683. }
  684. catch (Exception e)
  685. {
  686. _log.warning(""+e.getMessage());
  687. e.printStackTrace();
  688. }
  689. finally
  690. {
  691. try
  692. {
  693. statement.close();
  694. }
  695. catch (Exception e)
  696. {
  697. }
  698. try
  699. {
  700. con.close();
  701. }
  702. catch (Exception e)
  703. {
  704. }
  705. }
  706. }
  707. /**
  708. * Remove clan from siege<BR><BR>
  709. * @paramclan The clan being removed
  710. */
  711. public void removeSiegeClan(L2Clan clan)
  712. {
  713. if (clan == null
  714. || clan.getHasFort() == getFort().getFortId()
  715. || !FortSiegeManager.getInstance().checkIsRegistered(clan, getFort().getFortId()))
  716. return;
  717. removeSiegeClan(clan.getClanId());
  718. }
  719. /**
  720. * Start the auto tasks<BR>
  721. * <BR>
  722. */
  723. public void checkAutoTask()
  724. {
  725. if (_siegeStartTask != null) //safety check
  726. return;
  727. final long delay = getFort().getSiegeDate().getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
  728. if (delay < 0)
  729. {
  730. // siege time in past
  731. saveFortSiege();
  732. clearSiegeClan(); // remove all clans
  733. // spawn suspicious merchant immediately
  734. ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
  735. return;
  736. }
  737. else
  738. {
  739. loadSiegeClan();
  740. if (getAttackerClans().isEmpty())
  741. // no attackers - waiting for suspicious merchant spawn
  742. ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSuspiciousMerchantSpawn(getFort()), delay);
  743. else
  744. {
  745. // preparing start siege task
  746. if (delay > 3600000) // more than hour, how this can happens ? spawn suspicious merchant
  747. {
  748. ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
  749. _siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 3600), delay - 3600000);
  750. }
  751. if (delay > 600000) // more than 10 min, spawn suspicious merchant
  752. {
  753. ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
  754. _siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 600), delay - 600000);
  755. }
  756. else if (delay > 300000) // more than 5 min
  757. _siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 300), delay - 300000);
  758. else if (delay > 60000) //more than 1 min
  759. _siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 60), delay - 60000);
  760. else // lower than 1 min, set to 1 min
  761. _siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 60), 0);
  762. _log.info("Siege of " + getFort().getName() + " fort: " + getFort().getSiegeDate().getTime());
  763. }
  764. }
  765. }
  766. /**
  767. * Start the auto tasks<BR><BR>
  768. */
  769. public void startAutoTask(boolean setTime)
  770. {
  771. if (_siegeStartTask != null)
  772. return;
  773. if (setTime)
  774. setSiegeDateTime(false);
  775. if (getFort().getOwnerClan() != null)
  776. getFort().getOwnerClan().broadcastToOnlineMembers(new SystemMessage(SystemMessageId.A_FORTRESS_IS_UNDER_ATTACK));
  777. // Execute siege auto start
  778. _siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(),3600), 0);
  779. }
  780. /**
  781. * Teleport players
  782. */
  783. public void teleportPlayer(TeleportWhoType teleportWho, MapRegionTable.TeleportWhereType teleportWhere)
  784. {
  785. List<L2PcInstance> players;
  786. switch (teleportWho)
  787. {
  788. case Owner:
  789. players = getOwnersInZone();
  790. break;
  791. case Attacker:
  792. players = getAttackersInZone();
  793. break;
  794. default:
  795. players = getPlayersInZone();
  796. }
  797. for (L2PcInstance player : players)
  798. {
  799. if (player.isGM() || player.isInJail())
  800. continue;
  801. player.teleToLocation(teleportWhere);
  802. }
  803. }
  804. // =========================================================
  805. // Method - Private
  806. /**
  807. * Add clan as attacker<BR><BR>
  808. * @param clanId The int of clan's id
  809. */
  810. private void addAttacker(int clanId)
  811. {
  812. getAttackerClans().add(new L2SiegeClan(clanId, SiegeClanType.ATTACKER)); // Add registered attacker to attacker list
  813. }
  814. /**
  815. * Return true if the player can register.<BR><BR>
  816. * @param player The L2PcInstance of the player trying to register
  817. */
  818. public boolean checkIfCanRegister(L2PcInstance player)
  819. {
  820. boolean b = true;
  821. if (player.getClan() == null || player.getClan().getLevel() < FortSiegeManager.getInstance().getSiegeClanMinLevel())
  822. {
  823. b = false;
  824. player.sendMessage("Only clans with Level " + FortSiegeManager.getInstance().getSiegeClanMinLevel() + " and higher may register for a fortress siege.");
  825. }
  826. else if ((player.getClanPrivileges() & L2Clan.CP_CS_MANAGE_SIEGE) != L2Clan.CP_CS_MANAGE_SIEGE)
  827. {
  828. b = false;
  829. player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  830. }
  831. else if (player.getClan() == getFort().getOwnerClan())
  832. {
  833. b = false;
  834. player.sendPacket(new SystemMessage(SystemMessageId.CLAN_THAT_OWNS_CASTLE_IS_AUTOMATICALLY_REGISTERED_DEFENDING));
  835. }
  836. else if (getFort().getOwnerClan() != null && player.getClan().getHasCastle() > 0 && player.getClan().getHasCastle() == getFort().getCastleId())
  837. {
  838. b = false;
  839. player.sendPacket(new SystemMessage(SystemMessageId.CANT_REGISTER_TO_SIEGE_DUE_TO_CONTRACT));
  840. }
  841. else if (getFort().getSiege().getAttackerClans().isEmpty() && player.getInventory().getAdena() < 250000)
  842. {
  843. player.sendMessage("You need 250,000 adena to register"); // replace me with html
  844. }
  845. else
  846. {
  847. for (Fort fort : FortManager.getInstance().getForts())
  848. {
  849. if (fort.getSiege().getAttackerClan(player.getClanId())!= null)
  850. {
  851. b = false;
  852. player.sendPacket(new SystemMessage(SystemMessageId.ALREADY_REQUESTED_SIEGE_BATTLE));
  853. break;
  854. }
  855. if (fort.getOwnerClan() == player.getClan() && (fort.getSiege().getIsInProgress()||fort.getSiege()._siegeStartTask != null))
  856. {
  857. b = false;
  858. player.sendPacket(new SystemMessage(SystemMessageId.ALREADY_REQUESTED_SIEGE_BATTLE));
  859. break;
  860. }
  861. }
  862. }
  863. return b;
  864. }
  865. /**
  866. * Return true if the clan has already registered to a siege for the same day.<BR><BR>
  867. * @param clan The L2Clan of the player trying to register
  868. */
  869. public boolean checkIfAlreadyRegisteredForSameDay(L2Clan clan)
  870. {
  871. for (FortSiege siege : FortSiegeManager.getInstance().getSieges())
  872. {
  873. if (siege == this)
  874. continue;
  875. if (siege.getSiegeDate().get(Calendar.DAY_OF_WEEK) == getSiegeDate().get(Calendar.DAY_OF_WEEK))
  876. {
  877. if (siege.checkIsAttacker(clan))
  878. return true;
  879. if (siege.checkIsDefender(clan))
  880. return true;
  881. }
  882. }
  883. return false;
  884. }
  885. private void setSiegeDateTime(boolean merchant)
  886. {
  887. Calendar newDate = Calendar.getInstance();
  888. if (merchant)
  889. newDate.add(Calendar.MINUTE, FortSiegeManager.getInstance().getSuspiciousMerchantRespawnDelay());
  890. else
  891. newDate.add(Calendar.MINUTE, 60);
  892. getFort().setSiegeDate(newDate);
  893. saveSiegeDate();
  894. }
  895. /** Load siege clans. */
  896. private void loadSiegeClan()
  897. {
  898. Connection con = null;
  899. PreparedStatement statement = null;
  900. try
  901. {
  902. getAttackerClans().clear();
  903. ResultSet rs = null;
  904. con = L2DatabaseFactory.getInstance().getConnection();
  905. statement = con.prepareStatement("SELECT clan_id FROM fortsiege_clans WHERE fort_id=?");
  906. statement.setInt(1, getFort().getFortId());
  907. rs = statement.executeQuery();
  908. while (rs.next())
  909. {
  910. addAttacker(rs.getInt("clan_id"));
  911. }
  912. rs.close();
  913. }
  914. catch (Exception e)
  915. {
  916. _log.warning("Exception: loadSiegeClan(): " + e.getMessage());
  917. e.printStackTrace();
  918. }
  919. finally
  920. {
  921. try
  922. {
  923. statement.close();
  924. }
  925. catch (Exception e)
  926. {
  927. }
  928. try
  929. {
  930. con.close();
  931. }
  932. catch (Exception e)
  933. {
  934. _log.warning(""+e.getMessage());
  935. e.printStackTrace();
  936. }
  937. }
  938. }
  939. /** Remove commanders. */
  940. private void removeCommanders()
  941. {
  942. if (_commanders != null && !_commanders.isEmpty())
  943. {
  944. // Remove all instance of commanders for this fort
  945. for (L2Spawn spawn : _commanders.get(getFort().getFortId()))
  946. {
  947. if (spawn != null)
  948. {
  949. spawn.stopRespawn();
  950. spawn.getLastSpawn().deleteMe();
  951. }
  952. }
  953. _commanders.clear();
  954. }
  955. }
  956. /** Remove all flags. */
  957. private void removeFlags()
  958. {
  959. for (L2SiegeClan sc : getAttackerClans())
  960. {
  961. if (sc != null)
  962. sc.removeFlags();
  963. }
  964. }
  965. /** Save fort siege related to database. */
  966. private void saveFortSiege()
  967. {
  968. clearSiegeDate(); // clear siege date
  969. saveSiegeDate(); // Save the new date
  970. }
  971. /** Save siege date to database. */
  972. private void saveSiegeDate()
  973. {
  974. Connection con = null;
  975. PreparedStatement statement = null;
  976. try
  977. {
  978. con = L2DatabaseFactory.getInstance().getConnection();
  979. statement = con.prepareStatement("UPDATE fort SET siegeDate = ? WHERE id = ?");
  980. statement.setLong(1, getSiegeDate().getTimeInMillis());
  981. statement.setInt(2, getFort().getFortId());
  982. statement.execute();
  983. }
  984. catch (Exception e)
  985. {
  986. _log.warning("Exception: saveSiegeDate(): " + e.getMessage());
  987. e.printStackTrace();
  988. }
  989. finally
  990. {
  991. try
  992. {
  993. statement.close();
  994. }
  995. catch (Exception e)
  996. {
  997. }
  998. try
  999. {
  1000. con.close();
  1001. }
  1002. catch (Exception e)
  1003. {
  1004. _log.warning(""+e.getMessage());
  1005. e.printStackTrace();
  1006. }
  1007. }
  1008. }
  1009. /**
  1010. * Save registration to database.<BR><BR>
  1011. * @param clan The L2Clan of player
  1012. * @param typeId -1 = owner 0 = defender, 1 = attacker, 2 = defender waiting
  1013. */
  1014. private void saveSiegeClan(L2Clan clan)
  1015. {
  1016. if (getAttackerClans().size() >= FortSiegeManager.getInstance().getAttackerMaxClans())
  1017. return;
  1018. Connection con = null;
  1019. PreparedStatement statement = null;
  1020. try
  1021. {
  1022. con = L2DatabaseFactory.getInstance().getConnection();
  1023. statement = con.prepareStatement("INSERT INTO fortsiege_clans (clan_id,fort_id) values (?,?)");
  1024. statement.setInt(1, clan.getClanId());
  1025. statement.setInt(2, getFort().getFortId());
  1026. statement.execute();
  1027. addAttacker(clan.getClanId());
  1028. }
  1029. catch (Exception e)
  1030. {
  1031. _log.warning("Exception: saveSiegeClan(L2Clan clan): " + e.getMessage());
  1032. e.printStackTrace();
  1033. }
  1034. finally
  1035. {
  1036. try
  1037. {
  1038. statement.close();
  1039. }
  1040. catch (Exception e)
  1041. {
  1042. }
  1043. try
  1044. {
  1045. con.close();
  1046. }
  1047. catch (Exception e)
  1048. {
  1049. _log.warning(""+e.getMessage());
  1050. e.printStackTrace();
  1051. }
  1052. }
  1053. }
  1054. /** Spawn commanders. */
  1055. private void spawnCommanders()
  1056. {
  1057. //Set commanders array size if one does not exist
  1058. try
  1059. {
  1060. _commanders.clear();
  1061. L2Spawn spawnDat;
  1062. L2NpcTemplate template1;
  1063. _commandersSpawns = new FastList<L2Spawn>();
  1064. for (SiegeSpawn _sp : FortSiegeManager.getInstance().getCommanderSpawnList(getFort().getFortId()))
  1065. {
  1066. template1 = NpcTable.getInstance().getTemplate(_sp.getNpcId());
  1067. if (template1 != null)
  1068. {
  1069. spawnDat = new L2Spawn(template1);
  1070. spawnDat.setAmount(1);
  1071. spawnDat.setLocx(_sp.getLocation().getX());
  1072. spawnDat.setLocy(_sp.getLocation().getY());
  1073. spawnDat.setLocz(_sp.getLocation().getZ());
  1074. spawnDat.setHeading(_sp.getLocation().getHeading());
  1075. spawnDat.setRespawnDelay(60);
  1076. spawnDat.doSpawn();
  1077. spawnDat.stopRespawn();
  1078. _commandersSpawns.add(spawnDat);
  1079. }
  1080. else
  1081. {
  1082. _log.warning("FortSiege.spawnCommander: Data missing in NPC table for ID: "
  1083. + _sp.getNpcId() + ".");
  1084. }
  1085. _commanders.put(getFort().getFortId(), _commandersSpawns);
  1086. }
  1087. }
  1088. catch (Exception e)
  1089. {
  1090. // problem with initializing spawn, go to next one
  1091. _log.warning("FortSiege.spawnCommander: Spawn could not be initialized: "
  1092. + e.getMessage());
  1093. e.printStackTrace();
  1094. }
  1095. }
  1096. private void spawnFlag(int Id)
  1097. {
  1098. for (CombatFlag cf : FortSiegeManager.getInstance().getFlagList(Id))
  1099. cf.spawnMe();
  1100. }
  1101. private void unSpawnFlags()
  1102. {
  1103. if (FortSiegeManager.getInstance().getFlagList(getFort().getFortId()) == null)
  1104. return;
  1105. for (CombatFlag cf : FortSiegeManager.getInstance().getFlagList(getFort().getFortId()))
  1106. cf.unSpawnMe();
  1107. }
  1108. /**
  1109. * Spawn siege guard.<BR><BR>
  1110. */
  1111. private void spawnSiegeGuard()
  1112. {
  1113. getSiegeGuardManager().spawnSiegeGuard();
  1114. }
  1115. public final L2SiegeClan getAttackerClan(L2Clan clan)
  1116. {
  1117. if (clan == null)
  1118. return null;
  1119. return getAttackerClan(clan.getClanId());
  1120. }
  1121. public final L2SiegeClan getAttackerClan(int clanId)
  1122. {
  1123. for (L2SiegeClan sc : getAttackerClans())
  1124. if (sc != null && sc.getClanId() == clanId)
  1125. return sc;
  1126. return null;
  1127. }
  1128. public final List<L2SiegeClan> getAttackerClans()
  1129. {
  1130. return _attackerClans;
  1131. }
  1132. public final Fort getFort()
  1133. {
  1134. if (_fort == null || _fort.length <= 0)
  1135. return null;
  1136. return _fort[0];
  1137. }
  1138. public final boolean getIsInProgress()
  1139. {
  1140. return _isInProgress;
  1141. }
  1142. public final Calendar getSiegeDate()
  1143. {
  1144. return getFort().getSiegeDate();
  1145. }
  1146. public List<L2Npc> getFlag(L2Clan clan)
  1147. {
  1148. if (clan != null)
  1149. {
  1150. L2SiegeClan sc = getAttackerClan(clan);
  1151. if (sc != null)
  1152. return sc.getFlag();
  1153. }
  1154. return null;
  1155. }
  1156. public final FortSiegeGuardManager getSiegeGuardManager()
  1157. {
  1158. if (_siegeGuardManager == null)
  1159. _siegeGuardManager = new FortSiegeGuardManager(getFort());
  1160. return _siegeGuardManager;
  1161. }
  1162. public void resetSiege()
  1163. {
  1164. // reload commanders and repair doors
  1165. removeCommanders();
  1166. spawnCommanders();
  1167. getFort().resetDoors();
  1168. }
  1169. public FastMap<Integer, FastList<L2Spawn>> getCommanders()
  1170. {
  1171. return _commanders;
  1172. }
  1173. @Override
  1174. public L2SiegeClan getDefenderClan(int clanId)
  1175. {
  1176. return null;
  1177. }
  1178. @Override
  1179. public L2SiegeClan getDefenderClan(L2Clan clan)
  1180. {
  1181. return null;
  1182. }
  1183. @Override
  1184. public List<L2SiegeClan> getDefenderClans()
  1185. {
  1186. return null;
  1187. }
  1188. }