package client.messages.commands;
import client.MapleCharacter;
import client.MapleCharacterUtil;
import client.MapleClient;
import client.MapleStat;
import client.Skill;
import client.SkillFactory;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import client.messages.CommandProcessorUtil;
import constants.GameConstants;
import constants.ServerConstants.PlayerGMRank;
import handling.channel.ChannelServer;
import handling.world.CheaterData;
import handling.world.World;
import java.awt.Point;
import java.io.File;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import provider.MapleDataTool;
import provider.MapleData;
import provider.MapleDataProvider;
import provider.MapleDataProviderFactory;
import scripting.EventInstanceManager;
import scripting.EventManager;
import server.ItemInformation;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MaplePortal;
import server.MapleSquad;
import server.MapleSquad.MapleSquadType;
import server.life.MapleMonster;
import server.life.MapleNPC;
import server.maps.MapleMap;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.maps.MapleReactor;
import server.quest.MapleQuest;
import tools.packet.CField;
import tools.Pair;
import tools.StringUtil;
import tools.packet.CWvsContext;
/**
*
* @author Emilyx3
*/
public class InternCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.INTERN;
}
public static class Hide extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
SkillFactory.getSkill(GameConstants.GMS ? 9101004 : 9001004).getEffect(1).applyTo(c.getPlayer());
return 0;
}
}
public static class LowHP extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getStat().setHp((short) 1, c.getPlayer());
c.getPlayer().getStat().setMp((short) 1, c.getPlayer());
c.getPlayer().updateSingleStat(MapleStat.HP, 1);
c.getPlayer().updateSingleStat(MapleStat.MP, 1);
return 0;
}
}
public static class Heal extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getStat().heal(c.getPlayer());
c.getPlayer().dispelDebuffs();
return 0;
}
}
public static class HealHere extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
for (MapleCharacter mch : player.getMap().getCharacters()) {
if (mch != null) {
mch.getStat().setHp(mch.getStat().getMaxHp(), mch);
mch.updateSingleStat(MapleStat.HP, mch.getStat().getMaxHp());
mch.getStat().setMp(mch.getStat().getMaxMp(), mch);
mch.updateSingleStat(MapleStat.MP, mch.getStat().getMaxMp());
mch.dispelDebuffs();
}
}
return 1;
}
}
public static class TempB extends TempBan {
}
public static class TempBan extends CommandExecute {
protected boolean ipBan = false;
private String[] types = {"HACK", "BOT", "AD", "HARASS", "CURSE", "SCAM", "MISCONDUCT", "SELL", "ICASH", "TEMP", "GM", "IPROGRAM", "MEGAPHONE"};
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 4) {
c.getPlayer().dropMessage(6, "Tempban [name] [REASON] [days]");
StringBuilder s = new StringBuilder("Tempban reasons: ");
for (int i = 0; i < types.length; i++) {
s.append(i + 1).append(" - ").append(types[i]).append(", ");
}
c.getPlayer().dropMessage(6, s.toString());
return 0;
}
final MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
final int reason = Integer.parseInt(splitted[2]);
final int numDay = Integer.parseInt(splitted[3]);
final Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, numDay);
final DateFormat df = DateFormat.getInstance();
if (victim == null || reason < 0 || reason >= types.length) {
c.getPlayer().dropMessage(6, "Unable to find character or reason was not valid, type tempban to see reasons");
return 0;
}
victim.tempban("Temp banned by " + c.getPlayer().getName() + " for " + types[reason] + " reason", cal, reason, ipBan);
c.getPlayer().dropMessage(6, "The character " + splitted[1] + " has been successfully tempbanned till " + df.format(cal.getTime()));
return 1;
}
}
public static class B extends Ban {
}
public static class Ban extends CommandExecute {
protected boolean hellban = false, ipBan = false;
private String getCommand() {
if (hellban) {
return "HellBan";
} else {
return "Ban";
}
}
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(5, "[Syntax] !" + getCommand() + " <IGN> <Reason>");
return 0;
}
StringBuilder sb = new StringBuilder();
if (hellban) {
sb.append("Banned ").append(splitted[1]).append(": ").append(StringUtil.joinStringFrom(splitted, 2));
} else {
sb.append(c.getPlayer().getName()).append(" banned ").append(splitted[1]).append(": ").append(StringUtil.joinStringFrom(splitted, 2));
}
MapleCharacter target = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (target != null) {
if (c.getPlayer().getGMLevel() > target.getGMLevel() || c.getPlayer().isAdmin()) {
sb.append(" (IP: ").append(target.getClient().getSessionIPAddress()).append(")");
if (target.ban(sb.toString(), hellban || ipBan, false, hellban)) {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] Successfully banned " + splitted[1] + ".");
return 1;
} else {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] Failed to ban.");
return 0;
}
} else {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] May not ban GMs...");
return 1;
}
} else {
if (MapleCharacter.ban(splitted[1], sb.toString(), false, c.getPlayer().isAdmin() ? 250 : c.getPlayer().getGMLevel(), hellban)) {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] Successfully offline banned " + splitted[1] + ".");
return 1;
} else {
c.getPlayer().dropMessage(6, "[" + getCommand() + "] Failed to ban " + splitted[1]);
return 0;
}
}
}
}
public static class CC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().changeChannel(Integer.parseInt(splitted[1]));
return 1;
}
}
public static class CCPlayer extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().changeChannel(World.Find.findChannel(splitted[1]));
return 1;
}
}
public static class DC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[splitted.length - 1]);
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel()) {
victim.getClient().getSession().close();
victim.getClient().disconnect(true, false);
return 1;
} else {
c.getPlayer().dropMessage(6, "The victim does not exist.");
return 0;
}
}
}
public static class Kill extends CommandExecute {
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "Syntax: !kill <list player names>");
return 0;
}
MapleCharacter victim = null;
for (int i = 1; i < splitted.length; i++) {
try {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[i]);
} catch (Exception e) {
c.getPlayer().dropMessage(6, "Player " + splitted[i] + " not found.");
}
if (player.allowedToTarget(victim) && player.getGMLevel() >= victim.getGMLevel()) {
victim.getStat().setHp((short) 0, victim);
victim.getStat().setMp((short) 0, victim);
victim.updateSingleStat(MapleStat.HP, 0);
victim.updateSingleStat(MapleStat.MP, 0);
}
}
return 1;
}
}
public static class WhereAmI extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(5, "You are on map " + c.getPlayer().getMap().getId());
return 1;
}
}
public static class ClearInv extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
java.util.Map<Pair<Short, Short>, MapleInventoryType> eqs = new HashMap<Pair<Short, Short>, MapleInventoryType>();
if (splitted[1].equals("all")) {
for (MapleInventoryType type : MapleInventoryType.values()) {
for (Item item : c.getPlayer().getInventory(type)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), type);
}
}
} else if (splitted[1].equals("eqp")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.EQUIPPED)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), MapleInventoryType.EQUIPPED);
}
} else if (splitted[1].equals("eq")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.EQUIP)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), MapleInventoryType.EQUIP);
}
} else if (splitted[1].equals("u")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.USE)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), MapleInventoryType.USE);
}
} else if (splitted[1].equals("s")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.SETUP)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), MapleInventoryType.SETUP);
}
} else if (splitted[1].equals("e")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.ETC)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), MapleInventoryType.ETC);
}
} else if (splitted[1].equals("c")) {
for (Item item : c.getPlayer().getInventory(MapleInventoryType.CASH)) {
eqs.put(new Pair<Short, Short>(item.getPosition(), item.getQuantity()), MapleInventoryType.CASH);
}
} else {
c.getPlayer().dropMessage(6, "[all/eqp/eq/u/s/e/c]");
}
for (Entry<Pair<Short, Short>, MapleInventoryType> eq : eqs.entrySet()) {
MapleInventoryManipulator.removeFromSlot(c, eq.getValue(), eq.getKey().left, eq.getKey().right, false, false);
}
return 1;
}
}
public static class Online extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Characters connected to channel " + c.getChannel() + ":");
c.getPlayer().dropMessage(6, c.getChannelServer().getPlayerStorage().getOnlinePlayers(true));
return 1;
}
}
public static class OnlineChannel extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Characters connected to channel " + Integer.parseInt(splitted[1]) + ":");
c.getPlayer().dropMessage(6, ChannelServer.getInstance(Integer.parseInt(splitted[1])).getPlayerStorage().getOnlinePlayers(true));
return 1;
}
}
public static class ItemCheck extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3 || splitted[1] == null || splitted[1].equals("") || splitted[2] == null || splitted[2].equals("")) {
c.getPlayer().dropMessage(6, "!itemcheck <playername> <itemid>");
return 0;
} else {
int item = Integer.parseInt(splitted[2]);
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
int itemamount = chr.getItemQuantity(item, true);
if (itemamount > 0) {
c.getPlayer().dropMessage(6, chr.getName() + " has " + itemamount + " (" + item + ").");
} else {
c.getPlayer().dropMessage(6, chr.getName() + " doesn't have (" + item + ")");
}
}
return 1;
}
}
public static class Song extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().broadcastMessage(CField.musicChange(splitted[1]));
return 1;
}
}
public static class CheckPoint extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "Need playername.");
return 0;
}
MapleCharacter chrs = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chrs == null) {
c.getPlayer().dropMessage(6, "Make sure they are in the correct channel");
} else {
c.getPlayer().dropMessage(6, chrs.getName() + " has " + chrs.getPoints() + " points.");
}
return 1;
}
}
public static class CheckVPoint extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "Need playername.");
return 0;
}
MapleCharacter chrs = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (chrs == null) {
c.getPlayer().dropMessage(6, "Make sure they are in the correct channel");
} else {
c.getPlayer().dropMessage(6, chrs.getName() + " has " + chrs.getVPoints() + " vpoints.");
}
return 1;
}
}
public static class PermWeather extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getMap().getPermanentWeather() > 0) {
c.getPlayer().getMap().setPermanentWeather(0);
c.getPlayer().getMap().broadcastMessage(CField.removeMapEffect());
c.getPlayer().dropMessage(5, "Map weather has been disabled.");
} else {
final int weather = CommandProcessorUtil.getOptionalIntArg(splitted, 1, 5120000);
if (!MapleItemInformationProvider.getInstance().itemExists(weather) || weather / 10000 != 512) {
c.getPlayer().dropMessage(5, "Invalid ID.");
} else {
c.getPlayer().getMap().setPermanentWeather(weather);
c.getPlayer().getMap().broadcastMessage(CField.startMapEffect("", weather, false));
c.getPlayer().dropMessage(5, "Map weather has been enabled.");
}
}
return 1;
}
}
public static class CharInfo extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
final StringBuilder builder = new StringBuilder();
final MapleCharacter other = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (other == null) {
builder.append("...does not exist");
c.getPlayer().dropMessage(6, builder.toString());
return 0;
}
if (other.getClient().getLastPing() <= 0) {
other.getClient().sendPing();
}
builder.append(MapleClient.getLogMessage(other, ""));
builder.append(" at ").append(other.getPosition().x);
builder.append(" /").append(other.getPosition().y);
builder.append(" || HP : ");
builder.append(other.getStat().getHp());
builder.append(" /");
builder.append(other.getStat().getCurrentMaxHp());
builder.append(" || MP : ");
builder.append(other.getStat().getMp());
builder.append(" /");
builder.append(other.getStat().getCurrentMaxMp(other.getJob()));
builder.append(" || BattleshipHP : ");
builder.append(other.currentBattleshipHP());
builder.append(" || WATK : ");
builder.append(other.getStat().getTotalWatk());
builder.append(" || MATK : ");
builder.append(other.getStat().getTotalMagic());
builder.append(" || MAXDAMAGE : ");
builder.append(other.getStat().getCurrentMaxBaseDamage());
builder.append(" || DAMAGE% : ");
builder.append(other.getStat().dam_r);
builder.append(" || BOSSDAMAGE% : ");
builder.append(other.getStat().bossdam_r);
builder.append(" || CRIT CHANCE : ");
builder.append(other.getStat().passive_sharpeye_rate());
builder.append(" || CRIT DAMAGE : ");
builder.append(other.getStat().passive_sharpeye_percent());
builder.append(" || STR : ");
builder.append(other.getStat().getStr());
builder.append(" || DEX : ");
builder.append(other.getStat().getDex());
builder.append(" || INT : ");
builder.append(other.getStat().getInt());
builder.append(" || LUK : ");
builder.append(other.getStat().getLuk());
builder.append(" || Total STR : ");
builder.append(other.getStat().getTotalStr());
builder.append(" || Total DEX : ");
builder.append(other.getStat().getTotalDex());
builder.append(" || Total INT : ");
builder.append(other.getStat().getTotalInt());
builder.append(" || Total LUK : ");
builder.append(other.getStat().getTotalLuk());
builder.append(" || EXP : ");
builder.append(other.getExp());
builder.append(" || MESO : ");
builder.append(other.getMeso());
builder.append(" || party : ");
builder.append(other.getParty() == null ? -1 : other.getParty().getId());
builder.append(" || hasTrade: ");
builder.append(other.getTrade() != null);
builder.append(" || Latency: ");
builder.append(other.getClient().getLatency());
builder.append(" || PING: ");
builder.append(other.getClient().getLastPing());
builder.append(" || PONG: ");
builder.append(other.getClient().getLastPong());
builder.append(" || remoteAddress: ");
other.getClient().DebugMessage(builder);
c.getPlayer().dropMessage(6, builder.toString());
return 1;
}
}
public static class Connected extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
java.util.Map<Integer, Integer> connected = World.getConnected();
StringBuilder conStr = new StringBuilder("Connected Clients: ");
boolean first = true;
for (int i : connected.keySet()) {
if (!first) {
conStr.append(", ");
} else {
first = false;
}
if (i == 0) {
conStr.append("Total: ");
conStr.append(connected.get(i));
} else {
conStr.append("Channel");
conStr.append(i);
conStr.append(": ");
conStr.append(connected.get(i));
}
}
c.getPlayer().dropMessage(6, conStr.toString());
return 1;
}
}
public static class NearestPortal extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MaplePortal portal = c.getPlayer().getMap().findClosestPortal(c.getPlayer().getTruePosition());
c.getPlayer().dropMessage(6, portal.getName() + " id: " + portal.getId() + " script: " + portal.getScriptName());
return 1;
}
}
public static class SpawnDebug extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, c.getPlayer().getMap().spawnDebug());
return 1;
}
}
public static class FakeRelog extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().fakeRelog();
return 1;
}
}
public static class RemoveDrops extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(5, "Cleared " + c.getPlayer().getMap().getNumItems() + " drops");
c.getPlayer().getMap().removeDrops();
return 1;
}
}
public static class ListSquads extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (Entry<MapleSquad.MapleSquadType, MapleSquad> squads : c.getChannelServer().getAllSquads().entrySet()) {
c.getPlayer().dropMessage(5, "TYPE: " + squads.getKey().name() + ", Leader: " + squads.getValue().getLeader().getName() + ", status: " + squads.getValue().getStatus() + ", numMembers: " + squads.getValue().getSquadSize() + ", numBanned: " + squads.getValue().getBannedMemberSize());
}
return 0;
}
}
public static class ListInstances extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
EventManager em = c.getChannelServer().getEventSM().getEventManager(StringUtil.joinStringFrom(splitted, 1));
if (em == null || em.getInstances().size() <= 0) {
c.getPlayer().dropMessage(5, "none");
} else {
for (EventInstanceManager eim : em.getInstances()) {
c.getPlayer().dropMessage(5, "Event " + eim.getName() + ", charSize: " + eim.getPlayers().size() + ", dcedSize: " + eim.getDisconnected().size() + ", mobSize: " + eim.getMobs().size() + ", eventManager: " + em.getName() + ", timeLeft: " + eim.getTimeLeft() + ", iprops: " + eim.getProperties().toString() + ", eprops: " + em.getProperties().toString());
}
}
return 0;
}
}
public static class Uptime extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(6, "Server has been up for " + StringUtil.getReadableMillis(ChannelServer.serverStartTime, System.currentTimeMillis()));
return 1;
}
}
public static class EventInstance extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (c.getPlayer().getEventInstance() == null) {
c.getPlayer().dropMessage(5, "none");
} else {
EventInstanceManager eim = c.getPlayer().getEventInstance();
c.getPlayer().dropMessage(5, "Event " + eim.getName() + ", charSize: " + eim.getPlayers().size() + ", dcedSize: " + eim.getDisconnected().size() + ", mobSize: " + eim.getMobs().size() + ", eventManager: " + eim.getEventManager().getName() + ", timeLeft: " + eim.getTimeLeft() + ", iprops: " + eim.getProperties().toString() + ", eprops: " + eim.getEventManager().getProperties().toString());
}
return 1;
}
}
public static class GoTo extends CommandExecute {
private static final HashMap<String, Integer> gotomaps = new HashMap<String, Integer>();
static {
gotomaps.put("gmmap", 180000000);
gotomaps.put("southperry", 2000000);
gotomaps.put("amherst", 1010000);
gotomaps.put("henesys", 100000000);
gotomaps.put("ellinia", 101000000);
gotomaps.put("perion", 102000000);
gotomaps.put("kerning", 103000000);
gotomaps.put("harbor", 104000000);
gotomaps.put("sleepywood", 105000000);
gotomaps.put("florina", 120000300);
gotomaps.put("orbis", 200000000);
gotomaps.put("happyville", 209000000);
gotomaps.put("elnath", 211000000);
gotomaps.put("ludibrium", 220000000);
gotomaps.put("aquaroad", 230000000);
gotomaps.put("leafre", 240000000);
gotomaps.put("mulung", 250000000);
gotomaps.put("herbtown", 251000000);
gotomaps.put("omegasector", 221000000);
gotomaps.put("koreanfolktown", 222000000);
gotomaps.put("newleafcity", 600000000);
gotomaps.put("sharenian", 990000000);
gotomaps.put("pianus", 230040420);
gotomaps.put("horntail", 240060200);
gotomaps.put("chorntail", 240060201);
gotomaps.put("griffey", 240020101);
gotomaps.put("manon", 240020401);
gotomaps.put("zakum", 280030000);
gotomaps.put("czakum", 280030001);
gotomaps.put("papulatus", 220080001);
gotomaps.put("showatown", 801000000);
gotomaps.put("zipangu", 800000000);
gotomaps.put("ariant", 260000100);
gotomaps.put("nautilus", 120000000);
gotomaps.put("boatquay", 541000000);
gotomaps.put("malaysia", 550000000);
gotomaps.put("erev", 130000000);
gotomaps.put("ellin", 300000000);
gotomaps.put("kampung", 551000000);
gotomaps.put("singapore", 540000000);
gotomaps.put("amoria", 680000000);
gotomaps.put("timetemple", 270000000);
gotomaps.put("pinkbean", 270050100);
gotomaps.put("fm", 910000000);
gotomaps.put("freemarket", 910000000);
gotomaps.put("oxquiz", 109020001);
gotomaps.put("ola", 109030101);
gotomaps.put("fitness", 109040000);
gotomaps.put("snowball", 109060000);
gotomaps.put("golden", 950100000);
gotomaps.put("phantom", 610010000);
gotomaps.put("cwk", 610030000);
gotomaps.put("rien", 140000000);
gotomaps.put("edel", 310000000);
gotomaps.put("ardent", 910001000);
gotomaps.put("craft", 910001000);
gotomaps.put("pvp", 960000000);
gotomaps.put("future", 271000000);
}
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, "Syntax: !goto <mapname>");
} else {
if (gotomaps.containsKey(splitted[1])) {
MapleMap target = c.getChannelServer().getMapFactory().getMap(gotomaps.get(splitted[1]));
if (target == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MaplePortal targetPortal = target.getPortal(0);
c.getPlayer().changeMap(target, targetPortal);
} else {
if (splitted[1].equals("locations")) {
c.getPlayer().dropMessage(6, "Use !goto <location>. Locations are as follows:");
StringBuilder sb = new StringBuilder();
for (String s : gotomaps.keySet()) {
sb.append(s).append(", ");
}
c.getPlayer().dropMessage(6, sb.substring(0, sb.length() - 2));
} else {
c.getPlayer().dropMessage(6, "Invalid command syntax - Use !goto <location>. For a list of locations, use !goto locations.");
}
}
}
return 1;
}
}
public static class MonsterDebug extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
if (splitted.length > 1) {
//&& !splitted[0].equals("!killmonster") && !splitted[0].equals("!hitmonster") && !splitted[0].equals("!hitmonsterbyoid") && !splitted[0].equals("!killmonsterbyoid")) {
int irange = Integer.parseInt(splitted[1]);
if (splitted.length <= 2) {
range = irange * irange;
} else {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
}
}
if (map == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
c.getPlayer().dropMessage(6, "Monster " + mob.toString());
}
return 1;
}
}
public static class LookNPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleMapObject reactor1l : c.getPlayer().getMap().getAllNPCsThreadsafe()) {
MapleNPC reactor2l = (MapleNPC) reactor1l;
c.getPlayer().dropMessage(5, "NPC: oID: " + reactor2l.getObjectId() + " npcID: " + reactor2l.getId() + " Position: " + reactor2l.getPosition().toString() + " Name: " + reactor2l.getName());
}
return 0;
}
}
public static class LookReactor extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MapleMapObject reactor1l : c.getPlayer().getMap().getAllReactorsThreadsafe()) {
MapleReactor reactor2l = (MapleReactor) reactor1l;
c.getPlayer().dropMessage(5, "Reactor: oID: " + reactor2l.getObjectId() + " reactorID: " + reactor2l.getReactorId() + " Position: " + reactor2l.getPosition().toString() + " State: " + reactor2l.getState() + " Name: " + reactor2l.getName());
}
return 0;
}
}
public static class LookPortals extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (MaplePortal portal : c.getPlayer().getMap().getPortals()) {
c.getPlayer().dropMessage(5, "Portal: ID: " + portal.getId() + " script: " + portal.getScriptName() + " name: " + portal.getName() + " pos: " + portal.getPosition().x + "," + portal.getPosition().y + " target: " + portal.getTargetMapId() + " / " + portal.getTarget());
}
return 0;
}
}
public static class MyNPCPos extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
Point pos = c.getPlayer().getPosition();
c.getPlayer().dropMessage(6, "X: " + pos.x + " | Y: " + pos.y + " | RX0: " + (pos.x + 50) + " | RX1: " + (pos.x - 50) + " | FH: " + c.getPlayer().getFH());
return 1;
}
}
public static class Clock extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().broadcastMessage(CField.getClock(CommandProcessorUtil.getOptionalIntArg(splitted, 1, 60)));
return 1;
}
}
public static class WarpHere extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim != null) {
if (c.getPlayer().inPVP() || (!c.getPlayer().isGM() && (victim.isInBlockedMap() || victim.isGM()))) {
c.getPlayer().dropMessage(5, "Try again later.");
return 0;
}
victim.changeMap(c.getPlayer().getMap(), c.getPlayer().getMap().findClosestPortal(c.getPlayer().getTruePosition()));
} else {
int ch = World.Find.findChannel(splitted[1]);
if (ch < 0) {
c.getPlayer().dropMessage(5, "Not found.");
return 0;
}
victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(splitted[1]);
if (victim == null || victim.inPVP() || (!c.getPlayer().isGM() && (victim.isInBlockedMap() || victim.isGM()))) {
c.getPlayer().dropMessage(5, "Try again later.");
return 0;
}
c.getPlayer().dropMessage(5, "Victim is cross changing channel.");
victim.dropMessage(5, "Cross changing channel.");
if (victim.getMapId() != c.getPlayer().getMapId()) {
final MapleMap mapp = victim.getClient().getChannelServer().getMapFactory().getMap(c.getPlayer().getMapId());
victim.changeMap(mapp, mapp.findClosestPortal(c.getPlayer().getTruePosition()));
}
victim.changeChannel(c.getChannel());
}
return 1;
}
}
public static class Warp extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel() && !victim.inPVP() && !c.getPlayer().inPVP()) {
if (splitted.length == 2) {
c.getPlayer().changeMap(victim.getMap(), victim.getMap().findClosestSpawnpoint(victim.getTruePosition()));
} else {
MapleMap target = ChannelServer.getInstance(c.getChannel()).getMapFactory().getMap(Integer.parseInt(splitted[2]));
if (target == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MaplePortal targetPortal = null;
if (splitted.length > 3) {
try {
targetPortal = target.getPortal(Integer.parseInt(splitted[3]));
} catch (IndexOutOfBoundsException e) {
// noop, assume the gm didn't know how many portals there are
c.getPlayer().dropMessage(5, "Invalid portal selected.");
} catch (NumberFormatException a) {
// noop, assume that the gm is drunk
}
}
if (targetPortal == null) {
targetPortal = target.getPortal(0);
}
victim.changeMap(target, targetPortal);
}
} else {
try {
victim = c.getPlayer();
int ch = World.Find.findChannel(splitted[1]);
if (ch < 0) {
MapleMap target = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[1]));
if (target == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MaplePortal targetPortal = null;
if (splitted.length > 2) {
try {
targetPortal = target.getPortal(Integer.parseInt(splitted[2]));
} catch (IndexOutOfBoundsException e) {
// noop, assume the gm didn't know how many portals there are
c.getPlayer().dropMessage(5, "Invalid portal selected.");
} catch (NumberFormatException a) {
// noop, assume that the gm is drunk
}
}
if (targetPortal == null) {
targetPortal = target.getPortal(0);
}
c.getPlayer().changeMap(target, targetPortal);
} else {
victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(splitted[1]);
c.getPlayer().dropMessage(6, "Cross changing channel. Please wait.");
if (victim.getMapId() != c.getPlayer().getMapId()) {
final MapleMap mapp = c.getChannelServer().getMapFactory().getMap(victim.getMapId());
c.getPlayer().changeMap(mapp, mapp.findClosestPortal(victim.getTruePosition()));
}
c.getPlayer().changeChannel(ch);
}
} catch (Exception e) {
c.getPlayer().dropMessage(6, "Something went wrong " + e.getMessage());
return 0;
}
}
return 1;
}
}
public static class Jail extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "jail [name] [minutes, 0 = forever]");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
final int minutes = Math.max(0, Integer.parseInt(splitted[2]));
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel()) {
MapleMap target = ChannelServer.getInstance(c.getChannel()).getMapFactory().getMap(GameConstants.JAIL);
victim.getQuestNAdd(MapleQuest.getInstance(GameConstants.JAIL_QUEST)).setCustomData(String.valueOf(minutes * 60));
victim.changeMap(target, target.getPortal(0));
} else {
c.getPlayer().dropMessage(6, "Please be on their channel.");
return 0;
}
return 1;
}
}
public static class ListAllSquads extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (Entry<MapleSquad.MapleSquadType, MapleSquad> squads : cserv.getAllSquads().entrySet()) {
c.getPlayer().dropMessage(5, "[Channel " + cserv.getChannel() + "] TYPE: " + squads.getKey().name() + ", Leader: " + squads.getValue().getLeader().getName() + ", status: " + squads.getValue().getStatus() + ", numMembers: " + squads.getValue().getSquadSize() + ", numBanned: " + squads.getValue().getBannedMemberSize());
}
}
return 1;
}
}
public static class Say extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length > 1) {
StringBuilder sb = new StringBuilder();
sb.append("[");
if (!c.getPlayer().isGM()) {
sb.append("Intern ");
}
sb.append(c.getPlayer().getName());
sb.append("] ");
sb.append(StringUtil.joinStringFrom(splitted, 1));
World.Broadcast.broadcastMessage(CWvsContext.serverNotice(c.getPlayer().isGM() ? 6 : 5, sb.toString()));
} else {
c.getPlayer().dropMessage(6, "Syntax: say <message>");
return 0;
}
return 1;
}
}
public static class Letter extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 3) {
c.getPlayer().dropMessage(6, "syntax: !letter <color (green/red)> <word>");
return 0;
}
int start, nstart;
if (splitted[1].equalsIgnoreCase("green")) {
start = 3991026;
nstart = 3990019;
} else if (splitted[1].equalsIgnoreCase("red")) {
start = 3991000;
nstart = 3990009;
} else {
c.getPlayer().dropMessage(6, "Unknown color!");
return 0;
}
String splitString = StringUtil.joinStringFrom(splitted, 2);
List<Integer> chars = new ArrayList<Integer>();
splitString = splitString.toUpperCase();
// System.out.println(splitString);
for (int i = 0; i < splitString.length(); i++) {
char chr = splitString.charAt(i);
if (chr == ' ') {
chars.add(-1);
} else if ((int) (chr) >= (int) 'A' && (int) (chr) <= (int) 'Z') {
chars.add((int) (chr));
} else if ((int) (chr) >= (int) '0' && (int) (chr) <= (int) ('9')) {
chars.add((int) (chr) + 200);
}
}
final int w = 32;
int dStart = c.getPlayer().getPosition().x - (splitString.length() / 2 * w);
for (Integer i : chars) {
if (i == -1) {
dStart += w;
} else if (i < 200) {
int val = start + i - (int) ('A');
client.inventory.Item item = new client.inventory.Item(val, (byte) 0, (short) 1);
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), item, new Point(dStart, c.getPlayer().getPosition().y), false, false);
dStart += w;
} else if (i >= 200 && i <= 300) {
int val = nstart + i - (int) ('0') - 200;
client.inventory.Item item = new client.inventory.Item(val, (byte) 0, (short) 1);
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), item, new Point(dStart, c.getPlayer().getPosition().y), false, false);
dStart += w;
}
}
return 1;
}
}
public static class Find extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length == 1) {
c.getPlayer().dropMessage(6, splitted[0] + ": <NPC> <MOB> <ITEM> <MAP> <SKILL> <QUEST>");
} else if (splitted.length == 2) {
c.getPlayer().dropMessage(6, "Provide something to search.");
} else {
String type = splitted[1];
String search = StringUtil.joinStringFrom(splitted, 2);
MapleData data = null;
MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File("wz/String.wz"));
c.getPlayer().dropMessage(6, "<<Type: " + type + " | Search: " + search + ">>");
if (type.equalsIgnoreCase("NPC")) {
List<String> retNpcs = new ArrayList<String>();
data = dataProvider.getData("Npc.img");
List<Pair<Integer, String>> npcPairList = new LinkedList<Pair<Integer, String>>();
for (MapleData npcIdData : data.getChildren()) {
npcPairList.add(new Pair<Integer, String>(Integer.parseInt(npcIdData.getName()), MapleDataTool.getString(npcIdData.getChildByPath("name"), "NO-NAME")));
}
for (Pair<Integer, String> npcPair : npcPairList) {
if (npcPair.getRight().toLowerCase().contains(search.toLowerCase())) {
retNpcs.add(npcPair.getLeft() + " - " + npcPair.getRight());
}
}
if (retNpcs != null && retNpcs.size() > 0) {
for (String singleRetNpc : retNpcs) {
c.getPlayer().dropMessage(6, singleRetNpc);
}
} else {
c.getPlayer().dropMessage(6, "No NPC's Found");
}
} else if (type.equalsIgnoreCase("MAP")) {
List<String> retMaps = new ArrayList<String>();
data = dataProvider.getData("Map.img");
List<Pair<Integer, String>> mapPairList = new LinkedList<Pair<Integer, String>>();
for (MapleData mapAreaData : data.getChildren()) {
for (MapleData mapIdData : mapAreaData.getChildren()) {
mapPairList.add(new Pair<Integer, String>(Integer.parseInt(mapIdData.getName()), MapleDataTool.getString(mapIdData.getChildByPath("streetName"), "NO-NAME") + " - " + MapleDataTool.getString(mapIdData.getChildByPath("mapName"), "NO-NAME")));
}
}
for (Pair<Integer, String> mapPair : mapPairList) {
if (mapPair.getRight().toLowerCase().contains(search.toLowerCase())) {
retMaps.add(mapPair.getLeft() + " - " + mapPair.getRight());
}
}
if (retMaps != null && retMaps.size() > 0) {
for (String singleRetMap : retMaps) {
c.getPlayer().dropMessage(6, singleRetMap);
}
} else {
c.getPlayer().dropMessage(6, "No Maps Found");
}
} else if (type.equalsIgnoreCase("MOB")) {
List<String> retMobs = new ArrayList<String>();
data = dataProvider.getData("Mob.img");
List<Pair<Integer, String>> mobPairList = new LinkedList<Pair<Integer, String>>();
for (MapleData mobIdData : data.getChildren()) {
mobPairList.add(new Pair<Integer, String>(Integer.parseInt(mobIdData.getName()), MapleDataTool.getString(mobIdData.getChildByPath("name"), "NO-NAME")));
}
for (Pair<Integer, String> mobPair : mobPairList) {
if (mobPair.getRight().toLowerCase().contains(search.toLowerCase())) {
retMobs.add(mobPair.getLeft() + " - " + mobPair.getRight());
}
}
if (retMobs != null && retMobs.size() > 0) {
for (String singleRetMob : retMobs) {
c.getPlayer().dropMessage(6, singleRetMob);
}
} else {
c.getPlayer().dropMessage(6, "No Mobs Found");
}
} else if (type.equalsIgnoreCase("ITEM")) {
List<String> retItems = new ArrayList<String>();
for (ItemInformation itemPair : MapleItemInformationProvider.getInstance().getAllItems()) {
if (itemPair != null && itemPair.name != null && itemPair.name.toLowerCase().contains(search.toLowerCase())) {
retItems.add(itemPair.itemId + " - " + itemPair.name);
}
}
if (retItems != null && retItems.size() > 0) {
for (String singleRetItem : retItems) {
c.getPlayer().dropMessage(6, singleRetItem);
}
} else {
c.getPlayer().dropMessage(6, "No Items Found");
}
} else if (type.equalsIgnoreCase("QUEST")) {
List<String> retItems = new ArrayList<String>();
for (MapleQuest itemPair : MapleQuest.getAllInstances()) {
if (itemPair.getName().length() > 0 && itemPair.getName().toLowerCase().contains(search.toLowerCase())) {
retItems.add(itemPair.getId() + " - " + itemPair.getName());
}
}
if (retItems != null && retItems.size() > 0) {
for (String singleRetItem : retItems) {
c.getPlayer().dropMessage(6, singleRetItem);
}
} else {
c.getPlayer().dropMessage(6, "No Quests Found");
}
} else if (type.equalsIgnoreCase("SKILL")) {
List<String> retSkills = new ArrayList<String>();
for (Skill skil : SkillFactory.getAllSkills()) {
if (skil.getName() != null && skil.getName().toLowerCase().contains(search.toLowerCase())) {
retSkills.add(skil.getId() + " - " + skil.getName());
}
}
if (retSkills != null && retSkills.size() > 0) {
for (String singleRetSkill : retSkills) {
c.getPlayer().dropMessage(6, singleRetSkill);
}
} else {
c.getPlayer().dropMessage(6, "No Skills Found");
}
} else {
c.getPlayer().dropMessage(6, "Sorry, that search call is unavailable");
}
}
return 0;
}
}
public static class ID extends Find {
}
public static class LookUp extends Find {
}
public static class Search extends Find {
}
public static class WarpMap extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
try {
final MapleMap target = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[1]));
if (target == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
final MapleMap from = c.getPlayer().getMap();
for (MapleCharacter chr : from.getCharactersThreadsafe()) {
chr.changeMap(target, target.getPortal(0));
}
} catch (Exception e) {
c.getPlayer().dropMessage(5, "Error: " + e.getMessage());
return 0; //assume drunk GM
}
return 1;
}
}
public static class KillAll extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
if (splitted.length > 1) {
int irange = Integer.parseInt(splitted[1]);
if (splitted.length <= 2) {
range = irange * irange;
} else {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
}
}
if (map == null) {
c.getPlayer().dropMessage(6, "Map does not exist");
return 0;
}
MapleMonster mob;
for (MapleMapObject monstermo : map.getMapObjectsInRange(c.getPlayer().getPosition(), range, Arrays.asList(MapleMapObjectType.MONSTER))) {
mob = (MapleMonster) monstermo;
if (!mob.getStats().isBoss() || mob.getStats().isPartyBonus() || c.getPlayer().isGM()) {
map.killMonster(mob, c.getPlayer(), false, false, (byte) 1);
}
}
return 1;
}
}
}