AdminSiege.java 14 KB

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