/* * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.scripts.handlers.admin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import silentium.commons.utils.StringUtil; import silentium.gameserver.handler.IAdminCommandHandler; import silentium.gameserver.instancemanager.DayNightSpawnManager; import silentium.gameserver.instancemanager.RaidBossSpawnManager; import silentium.gameserver.model.L2Object; import silentium.gameserver.model.L2Spawn; import silentium.gameserver.model.L2World; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.entity.sevensigns.SevenSigns; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.clientpackets.Say2; import silentium.gameserver.network.serverpackets.NpcHtmlMessage; import silentium.gameserver.network.serverpackets.SystemMessage; import silentium.gameserver.tables.GmListTable; import silentium.gameserver.tables.NpcTable; import silentium.gameserver.tables.SpawnTable; import silentium.gameserver.templates.chars.L2NpcTemplate; import silentium.gameserver.utils.Broadcast; import java.util.List; import java.util.NoSuchElementException; import java.util.StringTokenizer; /** * This class handles following admin commands:<br> * - show_spawns = shows menu<br> * - spawn_index lvl = shows menu for monsters with respective level<br> * - spawn id = spawns monster id on target */ public class AdminSpawn implements IAdminCommandHandler { public static final Logger _log = LoggerFactory.getLogger(AdminSpawn.class.getName()); private static final String[] ADMIN_COMMANDS = { "admin_show_spawns", "admin_spawn", "admin_spawn_index", "admin_unspawnall", "admin_respawnall", "admin_spawn_reload", "admin_npc_index", "admin_spawn_once", "admin_show_npcs", "admin_spawnnight", "admin_spawnday" }; @Override public boolean useAdminCommand(final String command, final L2PcInstance activeChar) { if ("admin_show_spawns".equals(command)) AdminHelpPage.showHelpPage(activeChar, "spawns.htm"); else if (command.startsWith("admin_spawn_index")) { final StringTokenizer st = new StringTokenizer(command, " "); try { st.nextToken(); final int level = Integer.parseInt(st.nextToken()); int from = 0; try { from = Integer.parseInt(st.nextToken()); } catch (NoSuchElementException nsee) { } showMonsters(activeChar, level, from); } catch (Exception e) { AdminHelpPage.showHelpPage(activeChar, "spawns.htm"); } } else if ("admin_show_npcs".equals(command)) AdminHelpPage.showHelpPage(activeChar, "npcs.htm"); else if (command.startsWith("admin_npc_index")) { final StringTokenizer st = new StringTokenizer(command, " "); try { st.nextToken(); final String letter = st.nextToken(); int from = 0; try { from = Integer.parseInt(st.nextToken()); } catch (NoSuchElementException nsee) { } showNpcs(activeChar, letter, from); } catch (Exception e) { AdminHelpPage.showHelpPage(activeChar, "npcs.htm"); } } else if (command.startsWith("admin_spawn")) { final StringTokenizer st = new StringTokenizer(command, " "); try { final String cmd = st.nextToken(); final String id = st.nextToken(); final int respawnTime = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0; if ("admin_spawn_once".equalsIgnoreCase(cmd)) spawn(activeChar, id, respawnTime, false); else spawn(activeChar, id, respawnTime, true); } catch (Exception e) { AdminHelpPage.showHelpPage(activeChar, "spawns.htm"); } } else if (command.startsWith("admin_unspawnall")) { Broadcast.toAllOnlinePlayers(SystemMessage.getSystemMessage(SystemMessageId.NPC_SERVER_NOT_OPERATING)); RaidBossSpawnManager.getInstance().cleanUp(); DayNightSpawnManager.getInstance().cleanUp(); L2World.getInstance().deleteVisibleNpcSpawns(); GmListTable.broadcastMessageToGMs("NPCs' unspawn is now complete."); } else if (command.startsWith("admin_spawnday")) DayNightSpawnManager.getInstance().spawnDayCreatures(); else if (command.startsWith("admin_spawnnight")) DayNightSpawnManager.getInstance().spawnNightCreatures(); else if (command.startsWith("admin_respawnall") || command.startsWith("admin_spawn_reload")) { // make sure all spawns are deleted RaidBossSpawnManager.getInstance().cleanUp(); DayNightSpawnManager.getInstance().cleanUp(); L2World.getInstance().deleteVisibleNpcSpawns(); // now respawn all NpcTable.getInstance().reloadAllNpc(); SpawnTable.getInstance().reloadAll(); RaidBossSpawnManager.getInstance().reloadBosses(); SevenSigns.getInstance().spawnSevenSignsNPC(); GmListTable.broadcastMessageToGMs("NPCs' respawn is now complete."); } return true; } @Override public String[] getAdminCommandList() { return ADMIN_COMMANDS; } private static void spawn(final L2PcInstance activeChar, String monsterId, final int respawnTime, final boolean permanent) { L2Object target = activeChar.getTarget(); if (target == null) target = activeChar; final L2NpcTemplate template; if (monsterId.matches("[0-9]*")) // First parameter was an ID number template = NpcTable.getInstance().getTemplate(Integer.parseInt(monsterId)); else // First parameter wasn't just numbers, so go by name not ID { monsterId = monsterId.replace('_', ' '); template = NpcTable.getInstance().getTemplateByName(monsterId); } try { final L2Spawn spawn = new L2Spawn(template); spawn.setLocx(target.getX()); spawn.setLocy(target.getY()); spawn.setLocz(target.getZ()); spawn.setHeading(activeChar.getHeading()); spawn.setRespawnDelay(respawnTime); if (RaidBossSpawnManager.getInstance().getValidTemplate(spawn.getNpcId()) != null) { if (RaidBossSpawnManager.getInstance().isDefined(spawn.getNpcId())) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You cannot spawn another instance of " + template.getName() + '.'); return; } spawn.setRespawnMinDelay(43200); spawn.setRespawnMaxDelay(129600); RaidBossSpawnManager.getInstance().addNewSpawn(spawn, 0, template.getBaseHpMax(), template.getBaseMpMax(), permanent); } else { SpawnTable.getInstance().addNewSpawn(spawn, permanent); spawn.init(); } if (!permanent) spawn.stopRespawn(); activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Spawned " + template.getName() + '.'); } catch (Exception e) { activeChar.sendPacket(SystemMessageId.APPLICANT_INFORMATION_INCORRECT); } } private static void showMonsters(final L2PcInstance activeChar, final int level, final int from) { final List<L2NpcTemplate> mobs = NpcTable.getInstance().getAllMonstersOfLevel(level); final int mobsCount = mobs.size(); final StringBuilder tb = StringUtil.startAppend(500 + mobsCount * 80, "<html><title>Spawn Monster:</title><body><p> Level : ", Integer.toString(level), "<br>Total Npc's : ", Integer.toString(mobsCount), "<br>"); // Loop int i = from; for (int j = 0; i < mobsCount && j < 50; i++, j++) StringUtil.append(tb, "<a action=\"bypass -h admin_spawn ", Integer.toString(mobs.get(i).getNpcId()), "\">", mobs.get(i).getName(), "</a><br1>"); if (i == mobsCount) tb.append("<br><center><button value=\"Back\" action=\"bypass -h admin_show_spawns\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center></body></html>"); else 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=\"sek.cbui94\" fore=\"sek.cbui92\"><button value=\"Back\" action=\"bypass -h admin_show_spawns\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center></body></html>"); activeChar.sendPacket(new NpcHtmlMessage(5, tb.toString())); } private static void showNpcs(final L2PcInstance activeChar, final String starting, final int from) { final List<L2NpcTemplate> mobs = NpcTable.getInstance().getAllNpcStartingWith(starting); final int mobsCount = mobs.size(); final StringBuilder tb = StringUtil.startAppend(500 + mobsCount * 80, "<html><title>Spawn Monster:</title><body><p> There are ", Integer.toString(mobsCount), " Npcs whose name starts with ", starting, ":<br>"); // Loop int i = from; for (int j = 0; i < mobsCount && j < 50; i++, j++) StringUtil.append(tb, "<a action=\"bypass -h admin_spawn ", Integer.toString(mobs.get(i).getNpcId()), "\">", mobs.get(i).getName(), "</a><br1>"); if (i == mobsCount) tb.append("<br><center><button value=\"Back\" action=\"bypass -h admin_show_npcs\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center></body></html>"); else StringUtil.append(tb, "<br><center><button value=\"Next\" action=\"bypass -h admin_npc_index ", starting, " ", Integer.toString(i), "\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><button value=\"Back\" action=\"bypass -h admin_show_npcs\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center></body></html>"); activeChar.sendPacket(new NpcHtmlMessage(5, tb.toString())); } }