package client.messages.commands; import client.inventory.Item; import client.inventory.MapleInventoryType; import client.messages.CommandProcessorUtil; import clientside.MapleCharacter; import clientside.MapleCharacterUtil; import clientside.MapleClient; import clientside.MapleStat; import clientside.Skill; import clientside.SkillFactory; 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(9101004).getEffect(1).applyTo(c.getPlayer()); return 0; } } public static class UnHide extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dispelBuff(9101004); if (c.getPlayer().getChalkboard() != null) { } return 1; } } 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) { for (int i = 1; i <= ChannelServer.getChannelCount(); i++) { c.getPlayer().dropMessage(6, "Characters connected to channel " + i + ": " + ChannelServer.getInstance(i).getPlayerStorage().getAllCharacters().size()); c.getPlayer().dropMessage(6, ChannelServer.getInstance(i).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(System.getProperty("net.sf.odinms.wzpath") + "/" + "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; } } }