AdminSpawn.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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.List;
  17. import java.util.NoSuchElementException;
  18. import java.util.StringTokenizer;
  19. import java.util.logging.Logger;
  20. import java.util.regex.Matcher;
  21. import java.util.regex.Pattern;
  22. import com.l2jserver.Config;
  23. import com.l2jserver.gameserver.GmListTable;
  24. import com.l2jserver.gameserver.SevenSigns;
  25. import com.l2jserver.gameserver.datatables.NpcTable;
  26. import com.l2jserver.gameserver.datatables.SpawnTable;
  27. import com.l2jserver.gameserver.datatables.TeleportLocationTable;
  28. import com.l2jserver.gameserver.handler.IAdminCommandHandler;
  29. import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager;
  30. import com.l2jserver.gameserver.instancemanager.InstanceManager;
  31. import com.l2jserver.gameserver.instancemanager.QuestManager;
  32. import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
  33. import com.l2jserver.gameserver.model.AutoChatHandler;
  34. import com.l2jserver.gameserver.model.AutoSpawnHandler;
  35. import com.l2jserver.gameserver.model.L2Object;
  36. import com.l2jserver.gameserver.model.L2Spawn;
  37. import com.l2jserver.gameserver.model.L2World;
  38. import com.l2jserver.gameserver.model.actor.L2Npc;
  39. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  40. import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
  41. import com.l2jserver.gameserver.model.entity.Instance;
  42. import com.l2jserver.gameserver.network.SystemMessageId;
  43. import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  44. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  45. import com.l2jserver.gameserver.util.Broadcast;
  46. import com.l2jserver.util.StringUtil;
  47. /**
  48. * This class handles following admin commands: - show_spawns = shows menu -
  49. * spawn_index lvl = shows menu for monsters with respective level -
  50. * spawn_monster id = spawns monster id on target
  51. *
  52. * @version $Revision: 1.2.2.5.2.5 $ $Date: 2005/04/11 10:06:06 $
  53. */
  54. public class AdminSpawn implements IAdminCommandHandler
  55. {
  56. private static final Logger _log = Logger.getLogger(AdminSpawn.class.getName());
  57. private static final String[] ADMIN_COMMANDS =
  58. {
  59. "admin_show_spawns",
  60. "admin_spawn",
  61. "admin_spawn_monster",
  62. "admin_spawn_index",
  63. "admin_unspawnall",
  64. "admin_respawnall",
  65. "admin_spawn_reload",
  66. "admin_npc_index",
  67. "admin_spawn_once",
  68. "admin_show_npcs",
  69. "admin_teleport_reload",
  70. "admin_spawnnight",
  71. "admin_spawnday",
  72. "admin_instance_spawns",
  73. "admin_list_spawns",
  74. "admin_list_positions",
  75. "admin_spawn_debug_menu",
  76. "admin_spawn_debug_print",
  77. "admin_spawn_debug_print_menu"
  78. };
  79. @Override
  80. public boolean useAdminCommand(String command, L2PcInstance activeChar)
  81. {
  82. if (command.equals("admin_show_spawns"))
  83. {
  84. AdminHelpPage.showHelpPage(activeChar, "spawns.htm");
  85. }
  86. else if (command.equalsIgnoreCase("admin_spawn_debug_menu"))
  87. {
  88. AdminHelpPage.showHelpPage(activeChar, "spawns_debug.htm");
  89. }
  90. else if (command.startsWith("admin_spawn_debug_print"))
  91. {
  92. StringTokenizer st = new StringTokenizer(command, " ");
  93. L2Object target = activeChar.getTarget();
  94. if(target instanceof L2Npc)
  95. {
  96. try
  97. {
  98. st.nextToken();
  99. int type = Integer.parseInt(st.nextToken());
  100. printSpawn((L2Npc) target, type);
  101. if(command.contains("_menu"))
  102. AdminHelpPage.showHelpPage(activeChar, "spawns_debug.htm");
  103. }
  104. catch (Exception e)
  105. {
  106. }
  107. }
  108. else
  109. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  110. }
  111. else if (command.startsWith("admin_spawn_index"))
  112. {
  113. StringTokenizer st = new StringTokenizer(command, " ");
  114. try
  115. {
  116. st.nextToken();
  117. int level = Integer.parseInt(st.nextToken());
  118. int from = 0;
  119. try
  120. {
  121. from = Integer.parseInt(st.nextToken());
  122. }
  123. catch (NoSuchElementException nsee)
  124. {
  125. }
  126. showMonsters(activeChar, level, from);
  127. }
  128. catch (Exception e)
  129. {
  130. AdminHelpPage.showHelpPage(activeChar, "spawns.htm");
  131. }
  132. }
  133. else if (command.equals("admin_show_npcs"))
  134. {
  135. AdminHelpPage.showHelpPage(activeChar, "npcs.htm");
  136. }
  137. else if (command.startsWith("admin_npc_index"))
  138. {
  139. StringTokenizer st = new StringTokenizer(command, " ");
  140. try
  141. {
  142. st.nextToken();
  143. String letter = st.nextToken();
  144. int from = 0;
  145. try
  146. {
  147. from = Integer.parseInt(st.nextToken());
  148. }
  149. catch (NoSuchElementException nsee)
  150. {
  151. }
  152. showNpcs(activeChar, letter, from);
  153. }
  154. catch (Exception e)
  155. {
  156. AdminHelpPage.showHelpPage(activeChar, "npcs.htm");
  157. }
  158. }
  159. else if (command.startsWith("admin_instance_spawns"))
  160. {
  161. StringTokenizer st = new StringTokenizer(command, " ");
  162. try
  163. {
  164. st.nextToken();
  165. int instance = Integer.parseInt(st.nextToken());
  166. if(instance >= 300000)
  167. {
  168. final StringBuilder html = StringUtil.startAppend(500 + 1000,
  169. "<html><table width=\"100%\"><tr><td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td><td width=180><center>",
  170. "<font color=\"LEVEL\">Spawns for "+String.valueOf(instance)+"</font>",
  171. "</td><td width=45><button value=\"Back\" action=\"bypass -h admin_current_player\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr></table><br>",
  172. "<table width=\"100%\"><tr><td width=200>NpcName</td><td width=70>Action</td></tr>");
  173. int counter = 0;
  174. int skiped = 0;
  175. Instance inst = InstanceManager.getInstance().getInstance(instance);
  176. if(inst != null)
  177. {
  178. for(L2Npc npc : inst.getNpcs())
  179. {
  180. if(!npc.isDead())
  181. {
  182. // Only 50 because of client html limitation
  183. if(counter < 50)
  184. {
  185. StringUtil.append(html,"<tr><td>"+npc.getName()+"</td><td>",
  186. "<a action=\"bypass -h admin_move_to "+npc.getX()+" "+npc.getY()+" "+npc.getZ()+"\">Go</a>",
  187. "</td></tr>");
  188. counter++;
  189. }
  190. else
  191. skiped++;
  192. }
  193. }
  194. StringUtil.append(html, "<tr><td>Skipped:</td><td>"+String.valueOf(skiped)+"</td></tr></table></body></html>");
  195. NpcHtmlMessage ms = new NpcHtmlMessage(1);
  196. ms.setHtml(html.toString());
  197. activeChar.sendPacket(ms);
  198. }
  199. else
  200. activeChar.sendMessage("Cannot find instance "+instance);
  201. }
  202. else
  203. activeChar.sendMessage("Invalid instance number.");
  204. }
  205. catch (Exception e)
  206. {
  207. activeChar.sendMessage("Usage //instance_spawns <instance_number>");
  208. }
  209. }
  210. else if (command.startsWith("admin_unspawnall"))
  211. {
  212. Broadcast.toAllOnlinePlayers(SystemMessage.getSystemMessage(SystemMessageId.NPC_SERVER_NOT_OPERATING));
  213. RaidBossSpawnManager.getInstance().cleanUp();
  214. DayNightSpawnManager.getInstance().cleanUp();
  215. L2World.getInstance().deleteVisibleNpcSpawns();
  216. GmListTable.broadcastMessageToGMs("NPC Unspawn completed!");
  217. }
  218. else if (command.startsWith("admin_spawnday"))
  219. {
  220. DayNightSpawnManager.getInstance().spawnDayCreatures();
  221. }
  222. else if (command.startsWith("admin_spawnnight"))
  223. {
  224. DayNightSpawnManager.getInstance().spawnNightCreatures();
  225. }
  226. else if (command.startsWith("admin_respawnall") || command.startsWith("admin_spawn_reload"))
  227. {
  228. // make sure all spawns are deleted
  229. RaidBossSpawnManager.getInstance().cleanUp();
  230. DayNightSpawnManager.getInstance().cleanUp();
  231. L2World.getInstance().deleteVisibleNpcSpawns();
  232. // now respawn all
  233. NpcTable.getInstance().reloadAllNpc();
  234. SpawnTable.getInstance().reloadAll();
  235. RaidBossSpawnManager.getInstance().reloadBosses();
  236. AutoSpawnHandler.getInstance().reload();
  237. AutoChatHandler.getInstance().reload();
  238. SevenSigns.getInstance().spawnSevenSignsNPC();
  239. QuestManager.getInstance().reloadAllQuests();
  240. GmListTable.broadcastMessageToGMs("NPC Respawn completed!");
  241. }
  242. else if (command.startsWith("admin_teleport_reload"))
  243. {
  244. TeleportLocationTable.getInstance().reloadAll();
  245. GmListTable.broadcastMessageToGMs("Teleport List Table reloaded.");
  246. }
  247. else if (command.startsWith("admin_spawn_monster") || command.startsWith("admin_spawn"))
  248. {
  249. StringTokenizer st = new StringTokenizer(command, " ");
  250. try
  251. {
  252. String cmd = st.nextToken();
  253. String id = st.nextToken();
  254. int respawnTime = 0;
  255. int mobCount = 1;
  256. if (st.hasMoreTokens())
  257. mobCount = Integer.parseInt(st.nextToken());
  258. if (st.hasMoreTokens())
  259. respawnTime = Integer.parseInt(st.nextToken());
  260. if (cmd.equalsIgnoreCase("admin_spawn_once"))
  261. spawnMonster(activeChar, id, respawnTime, mobCount, false);
  262. else
  263. spawnMonster(activeChar, id, respawnTime, mobCount, true);
  264. }
  265. catch (Exception e)
  266. { // Case of wrong or missing monster data
  267. AdminHelpPage.showHelpPage(activeChar, "spawns.htm");
  268. }
  269. }
  270. else if (command.startsWith("admin_list_spawns") || command.startsWith("admin_list_positions"))
  271. {
  272. int npcId = 0;
  273. int teleportIndex = -1;
  274. try
  275. { // admin_list_spawns x[xxxx] x[xx]
  276. String[] params = command.split(" ");
  277. Pattern pattern = Pattern.compile("[0-9]*");
  278. Matcher regexp = pattern.matcher(params[1]);
  279. if (regexp.matches())
  280. npcId = Integer.parseInt(params[1]);
  281. else
  282. {
  283. params[1] = params[1].replace('_', ' ');
  284. npcId = NpcTable.getInstance().getTemplateByName(params[1]).getNpcId();
  285. }
  286. if (params.length > 2)
  287. teleportIndex = Integer.parseInt(params[2]);
  288. }
  289. catch (Exception e)
  290. {
  291. activeChar.sendMessage("Command format is //list_spawns <npcId|npc_name> [tele_index]");
  292. }
  293. if(command.startsWith("admin_list_positions"))
  294. SpawnTable.getInstance().findNPCInstances(activeChar, npcId, teleportIndex, true);
  295. else
  296. SpawnTable.getInstance().findNPCInstances(activeChar, npcId, teleportIndex, false);
  297. }
  298. return true;
  299. }
  300. @Override
  301. public String[] getAdminCommandList()
  302. {
  303. return ADMIN_COMMANDS;
  304. }
  305. private void printSpawn(L2Npc target, int type)
  306. {
  307. int i = target.getNpcId();
  308. int x = target.getSpawn().getLocx();
  309. int y = target.getSpawn().getLocy();
  310. int z = target.getSpawn().getLocz();
  311. int h = target.getSpawn().getHeading();
  312. switch(type)
  313. {
  314. default:
  315. case 0:
  316. _log.info("('',1,"+i+","+x+","+y+","+z+",0,0,"+h+",60,0,0),");
  317. break;
  318. case 1:
  319. _log.info("<spawn npcId=\""+i+"\" x=\""+x+"\" y=\""+y+"\" z=\""+z+"\" heading=\""+h+"\" respawn=\"0\" />");
  320. break;
  321. case 2:
  322. _log.info("{ "+i+", "+x+", "+y+", "+z+", "+h+" },");
  323. break;
  324. }
  325. }
  326. private void spawnMonster(L2PcInstance activeChar, String monsterId, int respawnTime, int mobCount, boolean permanent)
  327. {
  328. L2Object target = activeChar.getTarget();
  329. if (target == null)
  330. target = activeChar;
  331. L2NpcTemplate template1;
  332. if (monsterId.matches("[0-9]*"))
  333. {
  334. //First parameter was an ID number
  335. int monsterTemplate = Integer.parseInt(monsterId);
  336. template1 = NpcTable.getInstance().getTemplate(monsterTemplate);
  337. }
  338. else
  339. {
  340. //First parameter wasn't just numbers so go by name not ID
  341. monsterId = monsterId.replace('_', ' ');
  342. template1 = NpcTable.getInstance().getTemplateByName(monsterId);
  343. }
  344. try
  345. {
  346. L2Spawn spawn = new L2Spawn(template1);
  347. if (Config.SAVE_GMSPAWN_ON_CUSTOM)
  348. spawn.setCustom(true);
  349. spawn.setLocx(target.getX());
  350. spawn.setLocy(target.getY());
  351. spawn.setLocz(target.getZ());
  352. spawn.setAmount(mobCount);
  353. spawn.setHeading(activeChar.getHeading());
  354. spawn.setRespawnDelay(respawnTime);
  355. if (activeChar.getInstanceId() > 0)
  356. {
  357. spawn.setInstanceId(activeChar.getInstanceId());
  358. permanent = false;
  359. }
  360. else
  361. spawn.setInstanceId(0);
  362. // TODO add checks for GrandBossSpawnManager
  363. if (RaidBossSpawnManager.getInstance().isDefined(spawn.getNpcid()))
  364. activeChar.sendMessage("You cannot spawn another instance of " + template1.getName() + ".");
  365. else
  366. {
  367. if (RaidBossSpawnManager.getInstance().getValidTemplate(spawn.getNpcid()) != null)
  368. {
  369. spawn.setRespawnMinDelay(43200);
  370. spawn.setRespawnMaxDelay(129600);
  371. RaidBossSpawnManager.getInstance().addNewSpawn(spawn, 0, template1.getBaseHpMax(), template1.getBaseMpMax(), permanent);
  372. }
  373. else
  374. {
  375. SpawnTable.getInstance().addNewSpawn(spawn, permanent);
  376. spawn.init();
  377. }
  378. if (!permanent)
  379. spawn.stopRespawn();
  380. activeChar.sendMessage("Created " + template1.getName() + " on " + target.getObjectId());
  381. }
  382. }
  383. catch (Exception e)
  384. {
  385. activeChar.sendPacket(SystemMessageId.TARGET_CANT_FOUND);
  386. }
  387. }
  388. private void showMonsters(L2PcInstance activeChar, int level, int from)
  389. {
  390. final List<L2NpcTemplate> mobs = NpcTable.getInstance().getAllMonstersOfLevel(level);
  391. final int mobsCount = mobs.size();
  392. final StringBuilder tb = StringUtil.startAppend(500 + mobsCount * 80,
  393. "<html><title>Spawn Monster:</title><body><p> Level : ",
  394. Integer.toString(level),
  395. "<br>Total Npc's : ",
  396. Integer.toString(mobsCount),
  397. "<br>");
  398. // Loop
  399. int i = from;
  400. for (int j = 0; i < mobsCount && j < 50; i++, j++)
  401. StringUtil.append(tb, "<a action=\"bypass -h admin_spawn_monster ", Integer.toString(mobs.get(i).getNpcId()), "\">", mobs.get(i).getName(), "</a><br1>");
  402. if (i == mobsCount)
  403. tb.append("<br><center><button value=\"Back\" action=\"bypass -h admin_show_spawns\" width=40 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></center></body></html>");
  404. else
  405. StringUtil.append(tb, "<br><center><button value=\"Next\" action=\"bypass -h admin_spawn_index ", Integer.toString(level), " ", Integer.toString(i), "\" width=40 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><button value=\"Back\" action=\"bypass -h admin_show_spawns\" width=40 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></center></body></html>");
  406. activeChar.sendPacket(new NpcHtmlMessage(5, tb.toString()));
  407. }
  408. private void showNpcs(L2PcInstance activeChar, String starting, int from)
  409. {
  410. final List<L2NpcTemplate> mobs = NpcTable.getInstance().getAllNpcStartingWith(starting);
  411. final int mobsCount = mobs.size();
  412. final StringBuilder tb = StringUtil.startAppend(500 + mobsCount * 80,
  413. "<html><title>Spawn Monster:</title><body><p> There are ",
  414. Integer.toString(mobsCount),
  415. " Npcs whose name starts with ",
  416. starting,
  417. ":<br>");
  418. // Loop
  419. int i = from;
  420. for (int j = 0; i < mobsCount && j < 50; i++, j++)
  421. StringUtil.append(tb, "<a action=\"bypass -h admin_spawn_monster ", Integer.toString(mobs.get(i).getNpcId()), "\">", mobs.get(i).getName(), "</a><br1>");
  422. if (i == mobsCount)
  423. tb.append("<br><center><button value=\"Back\" action=\"bypass -h admin_show_npcs\" width=40 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></center></body></html>");
  424. else
  425. StringUtil.append(tb, "<br><center><button value=\"Next\" action=\"bypass -h admin_npc_index ", starting, " ", Integer.toString(i), "\" width=40 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><button value=\"Back\" action=\"bypass -h admin_show_npcs\" width=40 height=15 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></center></body></html>");
  426. activeChar.sendPacket(new NpcHtmlMessage(5, tb.toString()));
  427. }
  428. }