AdminSiege.java 12 KB

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