AdminSiege.java 14 KB

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