516 lines
17 KiB
Java
516 lines
17 KiB
Java
/*
|
|
* Copyright (C) 2004-2014 L2J DataPack
|
|
*
|
|
* This file is part of L2J DataPack.
|
|
*
|
|
* L2J DataPack 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.
|
|
*
|
|
* L2J DataPack 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 handlers.admincommandhandlers;
|
|
|
|
import java.util.List;
|
|
import java.util.NoSuchElementException;
|
|
import java.util.StringTokenizer;
|
|
import java.util.logging.Logger;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import com.l2jserver.Config;
|
|
import com.l2jserver.gameserver.datatables.AdminTable;
|
|
import com.l2jserver.gameserver.datatables.NpcData;
|
|
import com.l2jserver.gameserver.datatables.SpawnTable;
|
|
import com.l2jserver.gameserver.handler.IAdminCommandHandler;
|
|
import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager;
|
|
import com.l2jserver.gameserver.instancemanager.InstanceManager;
|
|
import com.l2jserver.gameserver.instancemanager.QuestManager;
|
|
import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
|
|
import com.l2jserver.gameserver.model.AutoSpawnHandler;
|
|
import com.l2jserver.gameserver.model.L2Object;
|
|
import com.l2jserver.gameserver.model.L2Spawn;
|
|
import com.l2jserver.gameserver.model.L2World;
|
|
import com.l2jserver.gameserver.model.actor.L2Npc;
|
|
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
|
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
|
|
import com.l2jserver.gameserver.model.entity.Instance;
|
|
import com.l2jserver.gameserver.network.SystemMessageId;
|
|
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
|
|
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
|
import com.l2jserver.gameserver.util.Broadcast;
|
|
import com.l2jserver.util.StringUtil;
|
|
|
|
/**
|
|
* This class handles following admin commands: - show_spawns = shows menu - spawn_index lvl = shows menu for monsters with respective level - spawn_monster id = spawns monster id on target
|
|
* @version $Revision: 1.2.2.5.2.5 $ $Date: 2005/04/11 10:06:06 $
|
|
*/
|
|
public class AdminSpawn implements IAdminCommandHandler
|
|
{
|
|
private static final Logger _log = Logger.getLogger(AdminSpawn.class.getName());
|
|
|
|
private static final String[] ADMIN_COMMANDS =
|
|
{
|
|
"admin_show_spawns",
|
|
"admin_spawn",
|
|
"admin_spawn_monster",
|
|
"admin_spawn_index",
|
|
"admin_unspawnall",
|
|
"admin_respawnall",
|
|
"admin_spawn_reload",
|
|
"admin_npc_index",
|
|
"admin_spawn_once",
|
|
"admin_show_npcs",
|
|
"admin_spawnnight",
|
|
"admin_spawnday",
|
|
"admin_instance_spawns",
|
|
"admin_list_spawns",
|
|
"admin_list_positions",
|
|
"admin_spawn_debug_menu",
|
|
"admin_spawn_debug_print",
|
|
"admin_spawn_debug_print_menu"
|
|
};
|
|
|
|
@Override
|
|
public boolean useAdminCommand(String command, L2PcInstance activeChar)
|
|
{
|
|
if (command.equals("admin_show_spawns"))
|
|
{
|
|
AdminHtml.showAdminHtml(activeChar, "spawns.htm");
|
|
}
|
|
else if (command.equalsIgnoreCase("admin_spawn_debug_menu"))
|
|
{
|
|
AdminHtml.showAdminHtml(activeChar, "spawns_debug.htm");
|
|
}
|
|
else if (command.startsWith("admin_spawn_debug_print"))
|
|
{
|
|
StringTokenizer st = new StringTokenizer(command, " ");
|
|
L2Object target = activeChar.getTarget();
|
|
if (target instanceof L2Npc)
|
|
{
|
|
try
|
|
{
|
|
st.nextToken();
|
|
int type = Integer.parseInt(st.nextToken());
|
|
printSpawn((L2Npc) target, type);
|
|
if (command.contains("_menu"))
|
|
{
|
|
AdminHtml.showAdminHtml(activeChar, "spawns_debug.htm");
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
activeChar.sendPacket(SystemMessageId.INVALID_TARGET);
|
|
}
|
|
}
|
|
else if (command.startsWith("admin_spawn_index"))
|
|
{
|
|
StringTokenizer st = new StringTokenizer(command, " ");
|
|
try
|
|
{
|
|
st.nextToken();
|
|
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)
|
|
{
|
|
AdminHtml.showAdminHtml(activeChar, "spawns.htm");
|
|
}
|
|
}
|
|
else if (command.equals("admin_show_npcs"))
|
|
{
|
|
AdminHtml.showAdminHtml(activeChar, "npcs.htm");
|
|
}
|
|
else if (command.startsWith("admin_npc_index"))
|
|
{
|
|
StringTokenizer st = new StringTokenizer(command, " ");
|
|
try
|
|
{
|
|
st.nextToken();
|
|
String letter = st.nextToken();
|
|
int from = 0;
|
|
try
|
|
{
|
|
from = Integer.parseInt(st.nextToken());
|
|
}
|
|
catch (NoSuchElementException nsee)
|
|
{
|
|
}
|
|
showNpcs(activeChar, letter, from);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
AdminHtml.showAdminHtml(activeChar, "npcs.htm");
|
|
}
|
|
}
|
|
else if (command.startsWith("admin_instance_spawns"))
|
|
{
|
|
StringTokenizer st = new StringTokenizer(command, " ");
|
|
try
|
|
{
|
|
st.nextToken();
|
|
int instance = Integer.parseInt(st.nextToken());
|
|
if (instance >= 300000)
|
|
{
|
|
final StringBuilder html = StringUtil.startAppend(500 + 1000, "<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>", "<font color=\"LEVEL\">Spawns for " + String.valueOf(instance) + "</font>", "</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>", "<table width=\"100%\"><tr><td width=200>NpcName</td><td width=70>Action</td></tr>");
|
|
int counter = 0;
|
|
int skiped = 0;
|
|
Instance inst = InstanceManager.getInstance().getInstance(instance);
|
|
if (inst != null)
|
|
{
|
|
for (L2Npc npc : inst.getNpcs())
|
|
{
|
|
if (!npc.isDead())
|
|
{
|
|
// Only 50 because of client html limitation
|
|
if (counter < 50)
|
|
{
|
|
StringUtil.append(html, "<tr><td>" + npc.getName() + "</td><td>", "<a action=\"bypass -h admin_move_to " + npc.getX() + " " + npc.getY() + " " + npc.getZ() + "\">Go</a>", "</td></tr>");
|
|
counter++;
|
|
}
|
|
else
|
|
{
|
|
skiped++;
|
|
}
|
|
}
|
|
}
|
|
StringUtil.append(html, "<tr><td>Skipped:</td><td>" + String.valueOf(skiped) + "</td></tr></table></body></html>");
|
|
final NpcHtmlMessage ms = new NpcHtmlMessage();
|
|
ms.setHtml(html.toString());
|
|
activeChar.sendPacket(ms);
|
|
}
|
|
else
|
|
{
|
|
activeChar.sendMessage("Cannot find instance " + instance);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
activeChar.sendMessage("Invalid instance number.");
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
activeChar.sendMessage("Usage //instance_spawns <instance_number>");
|
|
}
|
|
}
|
|
else if (command.startsWith("admin_unspawnall"))
|
|
{
|
|
Broadcast.toAllOnlinePlayers(SystemMessage.getSystemMessage(SystemMessageId.THE_NPC_SERVER_IS_NOT_OPERATING_AT_THIS_TIME));
|
|
RaidBossSpawnManager.getInstance().cleanUp();
|
|
DayNightSpawnManager.getInstance().cleanUp();
|
|
L2World.getInstance().deleteVisibleNpcSpawns();
|
|
AdminTable.getInstance().broadcastMessageToGMs("NPC Unspawn completed!");
|
|
}
|
|
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
|
|
NpcData.getInstance().load();
|
|
SpawnTable.getInstance().load();
|
|
RaidBossSpawnManager.getInstance().load();
|
|
AutoSpawnHandler.getInstance().reload();
|
|
QuestManager.getInstance().reloadAllScripts();
|
|
AdminTable.getInstance().broadcastMessageToGMs("NPC Respawn completed!");
|
|
}
|
|
else if (command.startsWith("admin_spawn_monster") || command.startsWith("admin_spawn"))
|
|
{
|
|
StringTokenizer st = new StringTokenizer(command, " ");
|
|
try
|
|
{
|
|
String cmd = st.nextToken();
|
|
String id = st.nextToken();
|
|
int respawnTime = 0;
|
|
int mobCount = 1;
|
|
if (st.hasMoreTokens())
|
|
{
|
|
mobCount = Integer.parseInt(st.nextToken());
|
|
}
|
|
if (st.hasMoreTokens())
|
|
{
|
|
respawnTime = Integer.parseInt(st.nextToken());
|
|
}
|
|
if (cmd.equalsIgnoreCase("admin_spawn_once"))
|
|
{
|
|
spawnMonster(activeChar, id, respawnTime, mobCount, false);
|
|
}
|
|
else
|
|
{
|
|
spawnMonster(activeChar, id, respawnTime, mobCount, true);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{ // Case of wrong or missing monster data
|
|
AdminHtml.showAdminHtml(activeChar, "spawns.htm");
|
|
}
|
|
}
|
|
else if (command.startsWith("admin_list_spawns") || command.startsWith("admin_list_positions"))
|
|
{
|
|
int npcId = 0;
|
|
int teleportIndex = -1;
|
|
try
|
|
{ // admin_list_spawns x[xxxx] x[xx]
|
|
String[] params = command.split(" ");
|
|
Pattern pattern = Pattern.compile("[0-9]*");
|
|
Matcher regexp = pattern.matcher(params[1]);
|
|
if (regexp.matches())
|
|
{
|
|
npcId = Integer.parseInt(params[1]);
|
|
}
|
|
else
|
|
{
|
|
params[1] = params[1].replace('_', ' ');
|
|
npcId = NpcData.getInstance().getTemplateByName(params[1]).getId();
|
|
}
|
|
if (params.length > 2)
|
|
{
|
|
teleportIndex = Integer.parseInt(params[2]);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
activeChar.sendMessage("Command format is //list_spawns <npcId|npc_name> [tele_index]");
|
|
}
|
|
if (command.startsWith("admin_list_positions"))
|
|
{
|
|
findNPCInstances(activeChar, npcId, teleportIndex, true);
|
|
}
|
|
else
|
|
{
|
|
findNPCInstances(activeChar, npcId, teleportIndex, false);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public String[] getAdminCommandList()
|
|
{
|
|
return ADMIN_COMMANDS;
|
|
}
|
|
|
|
/**
|
|
* Get all the spawn of a NPC.
|
|
* @param activeChar
|
|
* @param npcId
|
|
* @param teleportIndex
|
|
* @param showposition
|
|
*/
|
|
private void findNPCInstances(L2PcInstance activeChar, int npcId, int teleportIndex, boolean showposition)
|
|
{
|
|
int index = 0;
|
|
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
|
|
{
|
|
index++;
|
|
L2Npc npc = spawn.getLastSpawn();
|
|
if (teleportIndex > -1)
|
|
{
|
|
if (teleportIndex == index)
|
|
{
|
|
if (showposition && (npc != null))
|
|
{
|
|
activeChar.teleToLocation(npc.getLocation(), true);
|
|
}
|
|
else
|
|
{
|
|
activeChar.teleToLocation(spawn.getLocation(), true);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (showposition && (npc != null))
|
|
{
|
|
activeChar.sendMessage(index + " - " + spawn.getTemplate().getName() + " (" + spawn + "): " + npc.getX() + " " + npc.getY() + " " + npc.getZ());
|
|
}
|
|
else
|
|
{
|
|
activeChar.sendMessage(index + " - " + spawn.getTemplate().getName() + " (" + spawn + "): " + spawn.getX() + " " + spawn.getY() + " " + spawn.getZ());
|
|
}
|
|
}
|
|
}
|
|
|
|
if (index == 0)
|
|
{
|
|
activeChar.sendMessage(getClass().getSimpleName() + ": No current spawns found.");
|
|
}
|
|
}
|
|
|
|
private void printSpawn(L2Npc target, int type)
|
|
{
|
|
int i = target.getId();
|
|
int x = target.getSpawn().getX();
|
|
int y = target.getSpawn().getY();
|
|
int z = target.getSpawn().getZ();
|
|
int h = target.getSpawn().getHeading();
|
|
switch (type)
|
|
{
|
|
default:
|
|
case 0:
|
|
_log.info("('',1," + i + "," + x + "," + y + "," + z + ",0,0," + h + ",60,0,0),");
|
|
break;
|
|
case 1:
|
|
_log.info("<spawn npcId=\"" + i + "\" x=\"" + x + "\" y=\"" + y + "\" z=\"" + z + "\" heading=\"" + h + "\" respawn=\"0\" />");
|
|
break;
|
|
case 2:
|
|
_log.info("{ " + i + ", " + x + ", " + y + ", " + z + ", " + h + " },");
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void spawnMonster(L2PcInstance activeChar, String monsterId, int respawnTime, int mobCount, boolean permanent)
|
|
{
|
|
L2Object target = activeChar.getTarget();
|
|
if (target == null)
|
|
{
|
|
target = activeChar;
|
|
}
|
|
|
|
L2NpcTemplate template1;
|
|
if (monsterId.matches("[0-9]*"))
|
|
{
|
|
// First parameter was an ID number
|
|
int monsterTemplate = Integer.parseInt(monsterId);
|
|
template1 = NpcData.getInstance().getTemplate(monsterTemplate);
|
|
}
|
|
else
|
|
{
|
|
// First parameter wasn't just numbers so go by name not ID
|
|
monsterId = monsterId.replace('_', ' ');
|
|
template1 = NpcData.getInstance().getTemplateByName(monsterId);
|
|
}
|
|
|
|
try
|
|
{
|
|
L2Spawn spawn = new L2Spawn(template1);
|
|
if (Config.SAVE_GMSPAWN_ON_CUSTOM)
|
|
{
|
|
spawn.setCustom(true);
|
|
}
|
|
spawn.setX(target.getX());
|
|
spawn.setY(target.getY());
|
|
spawn.setZ(target.getZ());
|
|
spawn.setAmount(mobCount);
|
|
spawn.setHeading(activeChar.getHeading());
|
|
spawn.setRespawnDelay(respawnTime);
|
|
if (activeChar.getInstanceId() > 0)
|
|
{
|
|
spawn.setInstanceId(activeChar.getInstanceId());
|
|
permanent = false;
|
|
}
|
|
else
|
|
{
|
|
spawn.setInstanceId(0);
|
|
}
|
|
// TODO add checks for GrandBossSpawnManager
|
|
if (RaidBossSpawnManager.getInstance().isDefined(spawn.getId()))
|
|
{
|
|
activeChar.sendMessage("You cannot spawn another instance of " + template1.getName() + ".");
|
|
}
|
|
else
|
|
{
|
|
if (RaidBossSpawnManager.getInstance().getValidTemplate(spawn.getId()) != null)
|
|
{
|
|
spawn.setRespawnMinDelay(43200);
|
|
spawn.setRespawnMaxDelay(129600);
|
|
RaidBossSpawnManager.getInstance().addNewSpawn(spawn, 0, template1.getBaseHpMax(), template1.getBaseMpMax(), permanent);
|
|
}
|
|
else
|
|
{
|
|
SpawnTable.getInstance().addNewSpawn(spawn, permanent);
|
|
spawn.init();
|
|
}
|
|
if (!permanent)
|
|
{
|
|
spawn.stopRespawn();
|
|
}
|
|
activeChar.sendMessage("Created " + template1.getName() + " on " + target.getObjectId());
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
activeChar.sendPacket(SystemMessageId.YOUR_TARGET_CANNOT_BE_FOUND);
|
|
}
|
|
}
|
|
|
|
private void showMonsters(L2PcInstance activeChar, int level, int from)
|
|
{
|
|
final List<L2NpcTemplate> mobs = NpcData.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_monster ", Integer.toString(mobs.get(i).getId()), "\">", 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=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></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=\"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>");
|
|
}
|
|
|
|
activeChar.sendPacket(new NpcHtmlMessage(tb.toString()));
|
|
}
|
|
|
|
private void showNpcs(L2PcInstance activeChar, String starting, int from)
|
|
{
|
|
final List<L2NpcTemplate> mobs = NpcData.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_monster ", Integer.toString(mobs.get(i).getId()), "\">", 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=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></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=\"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>");
|
|
}
|
|
|
|
activeChar.sendPacket(new NpcHtmlMessage(tb.toString()));
|
|
}
|
|
}
|