/*
* 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 silentium.gameserver.ai.CtrlIntention;
import silentium.gameserver.data.xml.MapRegionData;
import silentium.gameserver.handler.IAdminCommandHandler;
import silentium.gameserver.model.L2Clan;
import silentium.gameserver.model.L2Object;
import silentium.gameserver.model.L2World;
import silentium.gameserver.model.actor.instance.L2PcInstance;
import silentium.gameserver.network.SystemMessageId;
import silentium.gameserver.network.clientpackets.Say2;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
/**
* This class handles teleport admin commands
*/
public class AdminTeleport implements IAdminCommandHandler {
private static final String[] ADMIN_COMMANDS = { "admin_runmod", "admin_instant_move", "admin_tele", "admin_tele_areas", "admin_goto", "admin_teleportto", // deprecated
"admin_recall", "admin_recall_party", "admin_recall_clan", "admin_move_to", "admin_sendhome" };
@Override
public boolean useAdminCommand(final String command, final L2PcInstance activeChar) {
// runmod
if ("admin_runmod".equals(command) || "admin_instant_move".equals(command))
activeChar.setTeleMode(1);
if ("admin_runmod tele".equals(command))
activeChar.setTeleMode(2);
if ("admin_runmod norm".equals(command))
activeChar.setTeleMode(0);
// teleport via panels
if ("admin_tele".equals(command))
AdminHelpPage.showHelpPage(activeChar, "teleports.htm");
if ("admin_tele_areas".equals(command))
AdminHelpPage.showHelpPage(activeChar, "tele/other.htm");
// recalls / goto types
if (command.startsWith("admin_goto") || command.startsWith("admin_teleportto")) {
final StringTokenizer st = new StringTokenizer(command);
if (st.countTokens() > 1) {
st.nextToken();
final String plyr = st.nextToken();
final L2PcInstance player = L2World.getInstance().getPlayer(plyr);
if (player == null) {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return false;
}
teleportToCharacter(activeChar, player);
}
} else if (command.startsWith("admin_recall ")) {
try {
final String targetName = command.substring(13);
final L2PcInstance player = L2World.getInstance().getPlayer(targetName);
if (player == null) {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return false;
}
teleportCharacter(player, activeChar.getX(), activeChar.getY(), activeChar.getZ());
} catch (StringIndexOutOfBoundsException e) {
}
} else if (command.startsWith("admin_recall_party")) {
try {
final String targetName = command.substring(19);
final L2PcInstance player = L2World.getInstance().getPlayer(targetName);
if (player == null) {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return false;
}
if (player.isInParty()) {
for (final L2PcInstance pm : player.getParty().getPartyMembers())
teleportCharacter(pm, activeChar.getX(), activeChar.getY(), activeChar.getZ());
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You recall " + player.getName() + "'s party.");
} else {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You recall " + player.getName() + ", but he isn't in a party.");
teleportCharacter(player, activeChar.getX(), activeChar.getY(), activeChar.getZ());
}
} catch (StringIndexOutOfBoundsException e) {
}
} else if (command.startsWith("admin_recall_clan")) {
try {
final String targetName = command.substring(18);
final L2PcInstance player = L2World.getInstance().getPlayer(targetName);
if (player == null) {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return false;
}
final L2Clan clan = player.getClan();
if (clan != null) {
final L2PcInstance[] members = clan.getOnlineMembers(0);
for (final L2PcInstance member : members)
teleportCharacter(member, activeChar.getX(), activeChar.getY(), activeChar.getZ());
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You recall " + player.getName() + "'s clan.");
} else {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You recall " + player.getName() + ", but he isn't a clan member.");
teleportCharacter(player, activeChar.getX(), activeChar.getY(), activeChar.getZ());
}
} catch (StringIndexOutOfBoundsException e) {
}
} else if (command.startsWith("admin_move_to")) {
try {
final String val = command.substring(14);
teleportTo(activeChar, val);
} catch (Exception e) {
// Case of empty or missing coordinates
AdminHelpPage.showHelpPage(activeChar, "teleports.htm");
}
} else if (command.startsWith("admin_sendhome")) {
final StringTokenizer st = new StringTokenizer(command);
if (st.countTokens() > 1) {
st.nextToken();
final String plyr = st.nextToken();
final L2PcInstance player = L2World.getInstance().getPlayer(plyr);
if (player == null) {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return false;
}
sendHome(player);
} else {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
// if target isn't a player, select yourself as target
player = target instanceof L2PcInstance ? (L2PcInstance) target : activeChar;
sendHome(player);
}
}
return true;
}
private static void sendHome(final L2PcInstance player) {
player.teleToLocation(MapRegionData.TeleportWhereType.Town);
player.setIsIn7sDungeon(false);
player.sendMessage("A GM sent you at nearest town.");
}
private static void teleportTo(final L2PcInstance activeChar, final String Cords) {
try {
final StringTokenizer st = new StringTokenizer(Cords);
final String x1 = st.nextToken();
final int x = Integer.parseInt(x1);
final String y1 = st.nextToken();
final int y = Integer.parseInt(y1);
final String z1 = st.nextToken();
final int z = Integer.parseInt(z1);
activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
activeChar.teleToLocation(x, y, z, false);
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You have been teleported to " + Cords + '.');
} catch (NoSuchElementException nsee) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Coordinates you entered as parameter [" + Cords + "] are wrong.");
}
}
private static void teleportCharacter(final L2PcInstance player, final int x, final int y, final int z) {
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
player.teleToLocation(x, y, z, true);
player.sendMessage("A GM is teleporting you.");
}
private static void teleportToCharacter(final L2PcInstance activeChar, final L2PcInstance target) {
if (target.getObjectId() == activeChar.getObjectId())
activeChar.sendPacket(SystemMessageId.CANNOT_USE_ON_YOURSELF);
else {
final int x = target.getX();
final int y = target.getY();
final int z = target.getZ();
activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
activeChar.teleToLocation(x, y, z, true);
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You have teleported to " + target.getName() + '.');
}
}
@Override
public String[] getAdminCommandList() {
return ADMIN_COMMANDS;
}
}