/*
* Copyright (C) 2004-2015 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 .
*/
package handlers.admincommandhandlers;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import com.l2jserver.Config;
import com.l2jserver.commons.database.pool.impl.ConnectionFactory;
import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.datatables.SpawnTable;
import com.l2jserver.gameserver.handler.IAdminCommandHandler;
import com.l2jserver.gameserver.instancemanager.MapRegionManager;
import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager;
import com.l2jserver.gameserver.model.L2Object;
import com.l2jserver.gameserver.model.L2Spawn;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.instance.L2RaidBossInstance;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.util.StringUtil;
/**
* This class handles following admin commands: - show_moves - show_teleport - teleport_to_character - move_to - teleport_character
* @version $Revision: 1.3.2.6.2.4 $ $Date: 2005/04/11 10:06:06 $ con.close() change and small typo fix by Zoey76 24/02/2011
*/
public class AdminTeleport implements IAdminCommandHandler
{
private static final Logger _log = Logger.getLogger(AdminTeleport.class.getName());
private static final String[] ADMIN_COMMANDS =
{
"admin_show_moves",
"admin_show_moves_other",
"admin_show_teleport",
"admin_teleport_to_character",
"admin_teleportto",
"admin_move_to",
"admin_teleport_character",
"admin_recall",
"admin_walk",
"teleportto",
"recall",
"admin_recall_npc",
"admin_gonorth",
"admin_gosouth",
"admin_goeast",
"admin_gowest",
"admin_goup",
"admin_godown",
"admin_tele",
"admin_teleto",
"admin_instant_move",
"admin_sendhome"
};
@Override
public boolean useAdminCommand(String command, L2PcInstance activeChar)
{
if (command.equals("admin_teleto"))
{
activeChar.setTeleMode(1);
}
if (command.equals("admin_instant_move"))
{
activeChar.sendMessage("Instant move ready. Click where you want to go.");
activeChar.setTeleMode(1);
}
if (command.equals("admin_teleto r"))
{
activeChar.setTeleMode(2);
}
if (command.equals("admin_teleto end"))
{
activeChar.setTeleMode(0);
}
if (command.equals("admin_show_moves"))
{
AdminHtml.showAdminHtml(activeChar, "teleports.htm");
}
if (command.equals("admin_show_moves_other"))
{
AdminHtml.showAdminHtml(activeChar, "tele/other.html");
}
else if (command.equals("admin_show_teleport"))
{
showTeleportCharWindow(activeChar);
}
else if (command.equals("admin_recall_npc"))
{
recallNPC(activeChar);
}
else if (command.equals("admin_teleport_to_character"))
{
teleportToCharacter(activeChar, activeChar.getTarget());
}
else if (command.startsWith("admin_walk"))
{
try
{
String val = command.substring(11);
StringTokenizer st = new StringTokenizer(val);
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int z = Integer.parseInt(st.nextToken());
activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(x, y, z, 0));
}
catch (Exception e)
{
if (Config.DEBUG)
{
_log.info("admin_walk: " + e);
}
}
}
else if (command.startsWith("admin_move_to"))
{
try
{
String val = command.substring(14);
teleportTo(activeChar, val);
}
catch (StringIndexOutOfBoundsException e)
{
// Case of empty or missing coordinates
AdminHtml.showAdminHtml(activeChar, "teleports.htm");
}
catch (NumberFormatException nfe)
{
activeChar.sendMessage("Usage: //move_to ");
AdminHtml.showAdminHtml(activeChar, "teleports.htm");
}
}
else if (command.startsWith("admin_teleport_character"))
{
try
{
String val = command.substring(25);
teleportCharacter(activeChar, val);
}
catch (StringIndexOutOfBoundsException e)
{
// Case of empty coordinates
activeChar.sendMessage("Wrong or no Coordinates given.");
showTeleportCharWindow(activeChar); // back to character teleport
}
}
else if (command.startsWith("admin_teleportto "))
{
try
{
String targetName = command.substring(17);
L2PcInstance player = L2World.getInstance().getPlayer(targetName);
teleportToCharacter(activeChar, player);
}
catch (StringIndexOutOfBoundsException e)
{
}
}
else if (command.startsWith("admin_recall "))
{
try
{
String[] param = command.split(" ");
if (param.length != 2)
{
activeChar.sendMessage("Usage: //recall ");
return false;
}
String targetName = param[1];
L2PcInstance player = L2World.getInstance().getPlayer(targetName);
if (player != null)
{
teleportCharacter(player, activeChar.getLocation(), activeChar);
}
else
{
changeCharacterPosition(activeChar, targetName);
}
}
catch (StringIndexOutOfBoundsException e)
{
}
}
else if (command.equals("admin_tele"))
{
showTeleportWindow(activeChar);
}
else if (command.startsWith("admin_go"))
{
int intVal = 150;
int x = activeChar.getX(), y = activeChar.getY(), z = activeChar.getZ();
try
{
String val = command.substring(8);
StringTokenizer st = new StringTokenizer(val);
String dir = st.nextToken();
if (st.hasMoreTokens())
{
intVal = Integer.parseInt(st.nextToken());
}
if (dir.equals("east"))
{
x += intVal;
}
else if (dir.equals("west"))
{
x -= intVal;
}
else if (dir.equals("north"))
{
y -= intVal;
}
else if (dir.equals("south"))
{
y += intVal;
}
else if (dir.equals("up"))
{
z += intVal;
}
else if (dir.equals("down"))
{
z -= intVal;
}
activeChar.teleToLocation(new Location(x, y, z));
showTeleportWindow(activeChar);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //go [offset] (default 150)");
}
}
else if (command.startsWith("admin_sendhome"))
{
StringTokenizer st = new StringTokenizer(command, " ");
st.nextToken(); // Skip command.
if (st.countTokens() > 1)
{
activeChar.sendMessage("Usage: //sendhome ");
}
else if (st.countTokens() == 1)
{
final String name = st.nextToken();
final L2PcInstance player = L2World.getInstance().getPlayer(name);
if (player == null)
{
activeChar.sendPacket(SystemMessageId.TARGET_IS_NOT_FOUND_IN_THE_GAME);
return false;
}
teleportHome(player);
}
else
{
final L2Object target = activeChar.getTarget();
if (target instanceof L2PcInstance)
{
teleportHome(target.getActingPlayer());
}
else
{
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
}
}
}
return true;
}
@Override
public String[] getAdminCommandList()
{
return ADMIN_COMMANDS;
}
/**
* This method sends a player to it's home town.
* @param player the player to teleport.
*/
private void teleportHome(L2PcInstance player)
{
String regionName;
switch (player.getRace())
{
case ELF:
regionName = "elf_town";
break;
case DARK_ELF:
regionName = "darkelf_town";
break;
case ORC:
regionName = "orc_town";
break;
case DWARF:
regionName = "dwarf_town";
break;
case KAMAEL:
regionName = "kamael_town";
break;
case HUMAN:
default:
regionName = "talking_island_town";
}
player.teleToLocation(MapRegionManager.getInstance().getMapRegionByName(regionName).getSpawnLoc(), true);
player.setInstanceId(0);
player.setIsIn7sDungeon(false);
}
private void teleportTo(L2PcInstance activeChar, String Coords)
{
try
{
StringTokenizer st = new StringTokenizer(Coords);
String x1 = st.nextToken();
int x = Integer.parseInt(x1);
String y1 = st.nextToken();
int y = Integer.parseInt(y1);
String z1 = st.nextToken();
int z = Integer.parseInt(z1);
activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
activeChar.teleToLocation(x, y, z);
activeChar.sendMessage("You have been teleported to " + Coords);
}
catch (NoSuchElementException nsee)
{
activeChar.sendMessage("Wrong or no Coordinates given.");
}
}
private void showTeleportWindow(L2PcInstance activeChar)
{
AdminHtml.showAdminHtml(activeChar, "move.htm");
}
private void showTeleportCharWindow(L2PcInstance activeChar)
{
L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
{
player = (L2PcInstance) target;
}
else
{
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return;
}
final NpcHtmlMessage adminReply = new NpcHtmlMessage();
final String replyMSG = StringUtil.concat("Teleport Character" + "" + "The character you will teleport is ", player.getName(), "." + " " + "Co-ordinate x" + "" + "Co-ordinate y" + "" + "Co-ordinate z" + "" + "