AdminSiege.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  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 handlers.admincommandhandlers;
  16. import java.util.Calendar;
  17. import java.util.StringTokenizer;
  18. import com.l2jserver.gameserver.SevenSigns;
  19. import com.l2jserver.gameserver.datatables.ClanTable;
  20. import com.l2jserver.gameserver.handler.IAdminCommandHandler;
  21. import com.l2jserver.gameserver.instancemanager.AuctionManager;
  22. import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
  23. import com.l2jserver.gameserver.instancemanager.CastleManager;
  24. import com.l2jserver.gameserver.instancemanager.ClanHallManager;
  25. import com.l2jserver.gameserver.model.L2Clan;
  26. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  27. import com.l2jserver.gameserver.model.entity.Castle;
  28. import com.l2jserver.gameserver.model.entity.ClanHall;
  29. import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
  30. import com.l2jserver.gameserver.model.zone.type.L2ClanHallZone;
  31. import com.l2jserver.gameserver.network.SystemMessageId;
  32. import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  33. import com.l2jserver.gameserver.util.Util;
  34. import com.l2jserver.util.StringUtil;
  35. /**
  36. * This class handles all siege commands.
  37. * @author Zoey76 (rework)
  38. */
  39. public class AdminSiege implements IAdminCommandHandler
  40. {
  41. private static final String[] ADMIN_COMMANDS =
  42. {
  43. // Castle commands
  44. "admin_siege",
  45. "admin_add_attacker",
  46. "admin_add_defender",
  47. "admin_add_guard",
  48. "admin_list_siege_clans",
  49. "admin_clear_siege_list",
  50. "admin_move_defenders",
  51. "admin_spawn_doors",
  52. "admin_endsiege",
  53. "admin_startsiege",
  54. "admin_setsiegetime",
  55. "admin_setcastle",
  56. "admin_removecastle",
  57. // Clan hall commands
  58. "admin_clanhall",
  59. "admin_clanhallset",
  60. "admin_clanhalldel",
  61. "admin_clanhallopendoors",
  62. "admin_clanhallclosedoors",
  63. "admin_clanhallteleportself"
  64. };
  65. @Override
  66. public boolean useAdminCommand(String command, L2PcInstance activeChar)
  67. {
  68. StringTokenizer st = new StringTokenizer(command, " ");
  69. command = st.nextToken(); // Get actual command
  70. // Get castle
  71. Castle castle = null;
  72. ClanHall clanhall = null;
  73. if (st.hasMoreTokens())
  74. {
  75. L2PcInstance player = null;
  76. if ((activeChar.getTarget() != null) && activeChar.getTarget().isPlayer())
  77. {
  78. player = activeChar.getTarget().getActingPlayer();
  79. }
  80. String val = st.nextToken();
  81. if (command.startsWith("admin_clanhall"))
  82. {
  83. if (Util.isDigit(val))
  84. {
  85. clanhall = ClanHallManager.getInstance().getClanHallById(Integer.parseInt(val));
  86. L2Clan clan = null;
  87. switch (command)
  88. {
  89. case "admin_clanhallset":
  90. if ((player == null) || (player.getClan() == null))
  91. {
  92. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  93. return false;
  94. }
  95. if (clanhall.getOwnerId() > 0)
  96. {
  97. activeChar.sendMessage("This Clan Hall is not free!");
  98. return false;
  99. }
  100. clan = player.getClan();
  101. if (clan.getHideoutId() > 0)
  102. {
  103. activeChar.sendMessage("You have already a Clan Hall!");
  104. return false;
  105. }
  106. if (!clanhall.isSiegableHall())
  107. {
  108. ClanHallManager.getInstance().setOwner(clanhall.getId(), clan);
  109. if (AuctionManager.getInstance().getAuction(clanhall.getId()) != null)
  110. {
  111. AuctionManager.getInstance().getAuction(clanhall.getId()).deleteAuctionFromDB();
  112. }
  113. }
  114. else
  115. {
  116. clanhall.setOwner(clan);
  117. clan.setHideoutId(clanhall.getId());
  118. }
  119. break;
  120. case "admin_clanhalldel":
  121. if (!clanhall.isSiegableHall())
  122. {
  123. if (!ClanHallManager.getInstance().isFree(clanhall.getId()))
  124. {
  125. ClanHallManager.getInstance().setFree(clanhall.getId());
  126. AuctionManager.getInstance().initNPC(clanhall.getId());
  127. }
  128. else
  129. {
  130. activeChar.sendMessage("This Clan Hall is already free!");
  131. }
  132. }
  133. else
  134. {
  135. final int oldOwner = clanhall.getOwnerId();
  136. if (oldOwner > 0)
  137. {
  138. clanhall.free();
  139. clan = ClanTable.getInstance().getClan(oldOwner);
  140. if (clan != null)
  141. {
  142. clan.setHideoutId(0);
  143. clan.broadcastClanStatus();
  144. }
  145. }
  146. }
  147. break;
  148. case "admin_clanhallopendoors":
  149. clanhall.openCloseDoors(true);
  150. break;
  151. case "admin_clanhallclosedoors":
  152. clanhall.openCloseDoors(false);
  153. break;
  154. case "admin_clanhallteleportself":
  155. final L2ClanHallZone zone = clanhall.getZone();
  156. if (zone != null)
  157. {
  158. activeChar.teleToLocation(zone.getSpawnLoc(), true);
  159. }
  160. break;
  161. default:
  162. if (!clanhall.isSiegableHall())
  163. {
  164. showClanHallPage(activeChar, clanhall);
  165. }
  166. else
  167. {
  168. showSiegableHallPage(activeChar, (SiegableHall) clanhall);
  169. }
  170. break;
  171. }
  172. }
  173. }
  174. else
  175. {
  176. castle = CastleManager.getInstance().getCastle(val);
  177. switch (command)
  178. {
  179. case "admin_add_attacker":
  180. if (player == null)
  181. {
  182. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  183. }
  184. else
  185. {
  186. castle.getSiege().registerAttacker(player, true);
  187. }
  188. break;
  189. case "admin_add_defender":
  190. if (player == null)
  191. {
  192. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  193. }
  194. else
  195. {
  196. castle.getSiege().registerDefender(player, true);
  197. }
  198. break;
  199. case "admin_add_guard":
  200. if (st.hasMoreTokens())
  201. {
  202. val = st.nextToken();
  203. if (Util.isDigit(val))
  204. {
  205. castle.getSiege().getSiegeGuardManager().addSiegeGuard(activeChar, Integer.parseInt(val));
  206. break;
  207. }
  208. }
  209. // If doesn't have more tokens or token is not a number.
  210. activeChar.sendMessage("Usage: //add_guard castle npcId");
  211. break;
  212. case "admin_clear_siege_list":
  213. castle.getSiege().clearSiegeClan();
  214. break;
  215. case "admin_endsiege":
  216. castle.getSiege().endSiege();
  217. break;
  218. case "admin_list_siege_clans":
  219. castle.getSiege().listRegisterClan(activeChar);
  220. break;
  221. case "admin_move_defenders":
  222. activeChar.sendMessage("Not implemented yet.");
  223. break;
  224. case "admin_setcastle":
  225. if ((player == null) || (player.getClan() == null))
  226. {
  227. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  228. }
  229. else
  230. {
  231. castle.setOwner(player.getClan());
  232. }
  233. break;
  234. case "admin_removecastle":
  235. final L2Clan clan = ClanTable.getInstance().getClan(castle.getOwnerId());
  236. if (clan != null)
  237. {
  238. castle.removeOwner(clan);
  239. }
  240. else
  241. {
  242. activeChar.sendMessage("Unable to remove castle.");
  243. }
  244. break;
  245. case "admin_setsiegetime":
  246. if (st.hasMoreTokens())
  247. {
  248. val = st.nextToken();
  249. final Calendar newAdminSiegeDate = Calendar.getInstance();
  250. newAdminSiegeDate.setTimeInMillis(castle.getSiegeDate().getTimeInMillis());
  251. if (val.equalsIgnoreCase("day"))
  252. {
  253. newAdminSiegeDate.set(Calendar.DAY_OF_YEAR, Integer.parseInt(st.nextToken()));
  254. }
  255. else if (val.equalsIgnoreCase("hour"))
  256. {
  257. newAdminSiegeDate.set(Calendar.HOUR_OF_DAY, Integer.parseInt(st.nextToken()));
  258. }
  259. else if (val.equalsIgnoreCase("min"))
  260. {
  261. newAdminSiegeDate.set(Calendar.MINUTE, Integer.parseInt(st.nextToken()));
  262. }
  263. if (newAdminSiegeDate.getTimeInMillis() < Calendar.getInstance().getTimeInMillis())
  264. {
  265. activeChar.sendMessage("Unable to change siege date.");
  266. }
  267. else if (newAdminSiegeDate.getTimeInMillis() != castle.getSiegeDate().getTimeInMillis())
  268. {
  269. castle.getSiegeDate().setTimeInMillis(newAdminSiegeDate.getTimeInMillis());
  270. castle.getSiege().saveSiegeDate();
  271. activeChar.sendMessage("Castle siege time for castle " + castle.getName() + " has been changed.");
  272. }
  273. }
  274. showSiegeTimePage(activeChar, castle);
  275. break;
  276. case "admin_spawn_doors":
  277. castle.spawnDoor();
  278. break;
  279. case "admin_startsiege":
  280. castle.getSiege().startSiege();
  281. break;
  282. default:
  283. showSiegePage(activeChar, castle.getName());
  284. break;
  285. }
  286. }
  287. }
  288. else
  289. {
  290. showCastleSelectPage(activeChar);
  291. }
  292. return true;
  293. }
  294. /**
  295. * Show castle select page.
  296. * @param activeChar the active char
  297. */
  298. private void showCastleSelectPage(L2PcInstance activeChar)
  299. {
  300. int i = 0;
  301. final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  302. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/castles.htm");
  303. final StringBuilder cList = new StringBuilder(500);
  304. for (Castle castle : CastleManager.getInstance().getCastles())
  305. {
  306. if (castle != null)
  307. {
  308. String name = castle.getName();
  309. StringUtil.append(cList, "<td fixwidth=90><a action=\"bypass -h admin_siege ", name, "\">", name, "</a></td>");
  310. i++;
  311. }
  312. if (i > 2)
  313. {
  314. cList.append("</tr><tr>");
  315. i = 0;
  316. }
  317. }
  318. adminReply.replace("%castles%", cList.toString());
  319. cList.setLength(0);
  320. i = 0;
  321. for (SiegableHall hall : CHSiegeManager.getInstance().getConquerableHalls().values())
  322. {
  323. if (hall != null)
  324. {
  325. StringUtil.append(cList, "<td fixwidth=90><a action=\"bypass -h admin_chsiege_siegablehall ", String.valueOf(hall.getId()), "\">", hall.getName(), "</a></td>");
  326. i++;
  327. }
  328. if (i > 1)
  329. {
  330. cList.append("</tr><tr>");
  331. i = 0;
  332. }
  333. }
  334. adminReply.replace("%siegableHalls%", cList.toString());
  335. cList.setLength(0);
  336. i = 0;
  337. for (ClanHall clanhall : ClanHallManager.getInstance().getClanHalls().values())
  338. {
  339. if (clanhall != null)
  340. {
  341. StringUtil.append(cList, "<td fixwidth=134><a action=\"bypass -h admin_clanhall ", String.valueOf(clanhall.getId()), "\">", clanhall.getName(), "</a></td>");
  342. i++;
  343. }
  344. if (i > 1)
  345. {
  346. cList.append("</tr><tr>");
  347. i = 0;
  348. }
  349. }
  350. adminReply.replace("%clanhalls%", cList.toString());
  351. cList.setLength(0);
  352. i = 0;
  353. for (ClanHall clanhall : ClanHallManager.getInstance().getFreeClanHalls().values())
  354. {
  355. if (clanhall != null)
  356. {
  357. StringUtil.append(cList, "<td fixwidth=134><a action=\"bypass -h admin_clanhall ", String.valueOf(clanhall.getId()), "\">", clanhall.getName(), "</a></td>");
  358. i++;
  359. }
  360. if (i > 1)
  361. {
  362. cList.append("</tr><tr>");
  363. i = 0;
  364. }
  365. }
  366. adminReply.replace("%freeclanhalls%", cList.toString());
  367. activeChar.sendPacket(adminReply);
  368. }
  369. /**
  370. * Show the siege page.
  371. * @param activeChar the active char
  372. * @param castleName the castle name
  373. */
  374. private void showSiegePage(L2PcInstance activeChar, String castleName)
  375. {
  376. final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  377. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/castle.htm");
  378. adminReply.replace("%castleName%", castleName);
  379. activeChar.sendPacket(adminReply);
  380. }
  381. /**
  382. * Show the siege time page.
  383. * @param activeChar the active char
  384. * @param castle the castle
  385. */
  386. private void showSiegeTimePage(L2PcInstance activeChar, Castle castle)
  387. {
  388. final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  389. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/castlesiegetime.htm");
  390. adminReply.replace("%castleName%", castle.getName());
  391. adminReply.replace("%time%", castle.getSiegeDate().getTime().toString());
  392. final Calendar newDay = Calendar.getInstance();
  393. boolean isSunday = false;
  394. if (newDay.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
  395. {
  396. isSunday = true;
  397. }
  398. else
  399. {
  400. newDay.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
  401. }
  402. if (!SevenSigns.getInstance().isDateInSealValidPeriod(newDay))
  403. {
  404. newDay.add(Calendar.DAY_OF_MONTH, 7);
  405. }
  406. if (isSunday)
  407. {
  408. adminReply.replace("%sundaylink%", String.valueOf(newDay.get(Calendar.DAY_OF_YEAR)));
  409. adminReply.replace("%sunday%", String.valueOf(newDay.get(Calendar.MONTH) + "/" + String.valueOf(newDay.get(Calendar.DAY_OF_MONTH))));
  410. newDay.add(Calendar.DAY_OF_MONTH, 13);
  411. adminReply.replace("%saturdaylink%", String.valueOf(newDay.get(Calendar.DAY_OF_YEAR)));
  412. adminReply.replace("%saturday%", String.valueOf(newDay.get(Calendar.MONTH) + "/" + String.valueOf(newDay.get(Calendar.DAY_OF_MONTH))));
  413. }
  414. else
  415. {
  416. adminReply.replace("%saturdaylink%", String.valueOf(newDay.get(Calendar.DAY_OF_YEAR)));
  417. adminReply.replace("%saturday%", String.valueOf(newDay.get(Calendar.MONTH) + "/" + String.valueOf(newDay.get(Calendar.DAY_OF_MONTH))));
  418. newDay.add(Calendar.DAY_OF_MONTH, 1);
  419. adminReply.replace("%sundaylink%", String.valueOf(newDay.get(Calendar.DAY_OF_YEAR)));
  420. adminReply.replace("%sunday%", String.valueOf(newDay.get(Calendar.MONTH) + "/" + String.valueOf(newDay.get(Calendar.DAY_OF_MONTH))));
  421. }
  422. activeChar.sendPacket(adminReply);
  423. }
  424. /**
  425. * Show the clan hall page.
  426. * @param activeChar the active char
  427. * @param clanhall the clan hall
  428. */
  429. private void showClanHallPage(L2PcInstance activeChar, ClanHall clanhall)
  430. {
  431. final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  432. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/clanhall.htm");
  433. adminReply.replace("%clanhallName%", clanhall.getName());
  434. adminReply.replace("%clanhallId%", String.valueOf(clanhall.getId()));
  435. final L2Clan owner = ClanTable.getInstance().getClan(clanhall.getOwnerId());
  436. adminReply.replace("%clanhallOwner%", (owner == null) ? "None" : owner.getName());
  437. activeChar.sendPacket(adminReply);
  438. }
  439. /**
  440. * Show the siegable hall page.
  441. * @param activeChar the active char
  442. * @param hall the siegable hall
  443. */
  444. private void showSiegableHallPage(L2PcInstance activeChar, SiegableHall hall)
  445. {
  446. final NpcHtmlMessage msg = new NpcHtmlMessage(5);
  447. msg.setFile(null, "data/html/admin/siegablehall.htm");
  448. msg.replace("%clanhallId%", String.valueOf(hall.getId()));
  449. msg.replace("%clanhallName%", hall.getName());
  450. if (hall.getOwnerId() > 0)
  451. {
  452. final L2Clan owner = ClanTable.getInstance().getClan(hall.getOwnerId());
  453. msg.replace("%clanhallOwner%", (owner != null) ? owner.getName() : "No Owner");
  454. }
  455. else
  456. {
  457. msg.replace("%clanhallOwner%", "No Owner");
  458. }
  459. activeChar.sendPacket(msg);
  460. }
  461. @Override
  462. public String[] getAdminCommandList()
  463. {
  464. return ADMIN_COMMANDS;
  465. }
  466. }