package server.commands; import client.MapleCharacter; import client.MapleCharacterUtil; import client.MapleClient; import client.MapleDisease; import client.MapleJob; import client.MapleStat; import client.Skill; import client.SkillFactory; import client.anticheat.ReportType; import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import constants.GameConstants; import constants.ServerConstants.PlayerGMRank; import handling.RecvPacketOpcode; import handling.SendPacketOpcode; import handling.channel.ChannelServer; import handling.world.CheaterData; import handling.world.World; 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.Objects; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import scripting.EventManager; import scripting.NPCScriptManager; import server.ItemInformation; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MaplePortal; import server.MapleSquad.MapleSquadType; import server.life.MapleLifeFactory; import server.life.MapleMonster; import server.life.MobSkillFactory; import server.maps.MapleMap; import server.maps.MapleMapItem; import server.maps.MapleMapObject; import server.maps.MapleMapObjectType; import server.quest.MapleQuest; import server.shops.MapleShopFactory; import tools.HexTool; import tools.Pair; import tools.StringUtil; import tools.packet.CField; import tools.packet.CField.NPCPacket; 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) { if (c.getPlayer().isHidden()) { c.getPlayer().dispelBuff(9101004); //MapleItemInformationProvider.getInstance().getItemEffect(2100069).applyTo(c.getPlayer()); //c.getSession().write(CWvsContext.InfoPacket.getStatusMsg(2100069)); } else { SkillFactory.getSkill(9101004).getEffect(1).applyTo(c.getPlayer()); } 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 HealMap 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 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 Online extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { String online = ""; for (int i = 1; i <= ChannelServer.getChannelCount(); i++) { online += ChannelServer.getInstance(i).getPlayerStorage().getOnlinePlayers(true); } c.getPlayer().dropMessage(6, online); 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(")"); builder.append("\r\nHP : "); 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("\r\nWATK : "); 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("\r\nSTR : "); builder.append(other.getStat().getStr()).append(" + (").append(other.getStat().getTotalStr() - other.getStat().getStr()).append(")"); builder.append(" || DEX : "); builder.append(other.getStat().getDex()).append(" + (").append(other.getStat().getTotalDex() - other.getStat().getDex()).append(")"); builder.append(" || INT : "); builder.append(other.getStat().getInt()).append(" + (").append(other.getStat().getTotalInt() - other.getStat().getInt()).append(")"); builder.append(" || LUK : "); builder.append(other.getStat().getLuk()).append(" + (").append(other.getStat().getTotalLuk() - other.getStat().getLuk()).append(")"); builder.append("\r\nEXP : "); builder.append(other.getExp()); builder.append(" || MESO : "); builder.append(other.getMeso()); builder.append("\r\nVote Points : "); builder.append(other.getVPoints()); builder.append(" || Event Points : "); builder.append(other.getPoints()); builder.append(" || NX Prepaid : "); builder.append(other.getCSPoints(1)); builder.append("\r\nParty : "); 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 Cheaters extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { List<CheaterData> cheaters = World.getCheaters(); for (int x = cheaters.size() - 1; x >= 0; x--) { CheaterData cheater = cheaters.get(x); c.getPlayer().dropMessage(6, cheater.getInfo()); } return 1; } } public static class GoTo extends CommandExecute { private static final HashMap<String, Integer> gotomaps = new HashMap<>(); static { gotomaps.put("ardent", 910001000); gotomaps.put("ariant", 260000100); gotomaps.put("amherst", 1010000); gotomaps.put("amoria", 680000000); gotomaps.put("aqua", 860000000); gotomaps.put("aquaroad", 230000000); gotomaps.put("boatquay", 541000000); gotomaps.put("cwk", 610030000); gotomaps.put("edelstein", 310000000); gotomaps.put("ellin", 300000000); gotomaps.put("ellinia", 101000000); gotomaps.put("ellinel", 101071300); gotomaps.put("elluel", 101050000); gotomaps.put("elnath", 211000000); gotomaps.put("erev", 130000000); gotomaps.put("florina", 120000300); gotomaps.put("fm", 910000000); gotomaps.put("future", 271000000); gotomaps.put("gmmap", 180000000); gotomaps.put("happy", 209000000); gotomaps.put("harbor", 104000000); gotomaps.put("henesys", 100000000); gotomaps.put("herbtown", 251000000); gotomaps.put("kampung", 551000000); gotomaps.put("kerning", 103000000); gotomaps.put("korean", 222000000); gotomaps.put("leafre", 240000000); gotomaps.put("ludi", 220000000); gotomaps.put("malaysia", 550000000); gotomaps.put("mulung", 250000000); gotomaps.put("nautilus", 120000000); gotomaps.put("nlc", 600000000); gotomaps.put("omega", 221000000); gotomaps.put("orbis", 200000000); gotomaps.put("pantheon", 400000000); gotomaps.put("pinkbean", 270050100); gotomaps.put("phantom", 610010000); gotomaps.put("perion", 102000000); gotomaps.put("rien", 140000000); gotomaps.put("showatown", 801000000); gotomaps.put("singapore", 540000000); gotomaps.put("sixpath", 104020000); gotomaps.put("sleepywood", 105000000); gotomaps.put("southperry", 2000000); gotomaps.put("tot", 270000000); gotomaps.put("twilight", 273000000); gotomaps.put("tynerum", 301000000); gotomaps.put("zipangu", 800000000); 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("pap", 220080001); gotomaps.put("oxquiz", 109020001); gotomaps.put("ola", 109030101); gotomaps.put("fitness", 109040000); gotomaps.put("snowball", 109060000); } @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 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 Map extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { try { MapleCharacter victim; 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 (NumberFormatException e) { c.getPlayer().dropMessage(6, "Something went wrong " + e.getMessage()); return 0; } 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.broadcastMsg(c.getPlayer().isGM() ? 6 : 5, sb.toString())); } else { c.getPlayer().dropMessage(6, "Syntax: say <message>"); return 0; } 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> <HEADER/OPCODE>"); } 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; MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")); StringBuilder sb = new StringBuilder(); sb.append("<<" + "Type: ").append(type).append(" | " + "Search: ").append(search).append(">>"); if (type.equalsIgnoreCase("NPC")) { List<String> retNpcs = new ArrayList<>(); data = dataProvider.getData("Npc.img"); List<Pair<Integer, String>> npcPairList = new LinkedList<>(); for (MapleData npcIdData : data.getChildren()) { npcPairList.add(new Pair<>(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("\r\n" + npcPair.getLeft() + " - " + npcPair.getRight()); } } if (retNpcs != null && retNpcs.size() > 0) { for (String singleRetNpc : retNpcs) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(singleRetNpc.toString()); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, retNpcs.toString(), "00 00", (byte) 0, 9010000)); //c.getPlayer().dropMessage(6, singleRetNpc); } } else { c.getPlayer().dropMessage(6, "No NPC's Found"); } } else if (type.equalsIgnoreCase("MAP")) { List<String> retMaps = new ArrayList<>(); data = dataProvider.getData("Map.img"); List<Pair<Integer, String>> mapPairList = new LinkedList<>(); for (MapleData mapAreaData : data.getChildren()) { for (MapleData mapIdData : mapAreaData.getChildren()) { mapPairList.add(new Pair<>(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("\r\n" + mapPair.getLeft() + " - " + mapPair.getRight()); } } if (retMaps != null && retMaps.size() > 0) { for (String singleRetMap : retMaps) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(singleRetMap); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, retMaps.toString(), "00 00", (byte) 0, 9010000)); //c.getPlayer().dropMessage(6, singleRetMap); } } else { c.getPlayer().dropMessage(6, "No Maps Found"); } } else if (type.equalsIgnoreCase("MOB")) { List<String> retMobs = new ArrayList<>(); data = dataProvider.getData("Mob.img"); List<Pair<Integer, String>> mobPairList = new LinkedList<>(); for (MapleData mobIdData : data.getChildren()) { mobPairList.add(new Pair<>(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("\r\n" + mobPair.getLeft() + " - " + mobPair.getRight()); } } if (retMobs != null && retMobs.size() > 0) { for (String singleRetMob : retMobs) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(singleRetMob); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, retMobs.toString(), "00 00", (byte) 0, 9010000)); //c.getPlayer().dropMessage(6, singleRetMob); } } else { c.getPlayer().dropMessage(6, "No Mobs Found"); } } else if (type.equalsIgnoreCase("ITEM")) { List<String> retItems = new ArrayList<>(); for (ItemInformation itemPair : MapleItemInformationProvider.getInstance().getAllItems()) { if (itemPair != null && itemPair.name != null && itemPair.name.toLowerCase().contains(search.toLowerCase())) { retItems.add("\r\n" + itemPair.itemId + " - " + itemPair.name); } } if (retItems != null && retItems.size() > 0) { for (String singleRetItem : retItems) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(singleRetItem); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, retItems.toString(), "00 00", (byte) 0, 9010000)); //c.getPlayer().dropMessage(6, singleRetItem); } } else { c.getPlayer().dropMessage(6, "No Items Found"); } } else if (type.equalsIgnoreCase("QUEST")) { List<String> retQuests = new ArrayList<>(); for (MapleQuest questPair : MapleQuest.getAllInstances()) { if (questPair.getName().length() > 0 && questPair.getName().toLowerCase().contains(search.toLowerCase())) { retQuests.add("\r\n" + questPair.getId() + " - " + questPair.getName()); } } if (retQuests != null && retQuests.size() > 0) { for (String singleRetQuest : retQuests) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(singleRetQuest); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, retQuests.toString(), "00 00", (byte) 0, 9010000)); // c.getPlayer().dropMessage(6, singleRetItem); } } else { c.getPlayer().dropMessage(6, "No Quests Found"); } } else if (type.equalsIgnoreCase("SKILL")) { List<String> retSkills = new ArrayList<>(); for (Skill skill : SkillFactory.getAllSkills()) { if (skill.getName() != null && skill.getName().toLowerCase().contains(search.toLowerCase())) { retSkills.add("\r\n" + skill.getId() + " - " + skill.getName()); } } if (retSkills != null && retSkills.size() > 0) { for (String singleRetSkill : retSkills) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(singleRetSkill); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, retSkills.toString(), "00 00", (byte) 0, 9010000)); // c.getPlayer().dropMessage(6, singleRetSkill); } } else { c.getPlayer().dropMessage(6, "No Skills Found"); } } else if (type.equalsIgnoreCase("HEADER") || type.equalsIgnoreCase("OPCODE")) { List<String> headers = new ArrayList<>(); headers.add("\r\nSend Opcodes:"); for (SendPacketOpcode send : SendPacketOpcode.values()) { if (send.name() != null && send.name().toLowerCase().contains(search.toLowerCase())) { headers.add("\r\n" + send.name() + " Value: " + send.getValue() + " Hex: " + HexTool.getOpcodeToString(send.getValue())); } } headers.add("\r\nRecv Opcodes:"); for (RecvPacketOpcode recv : RecvPacketOpcode.values()) { if (recv.name() != null && recv.name().toLowerCase().contains(search.toLowerCase())) { headers.add("\r\n" + recv.name() + " Value: " + recv.getValue() + " Hex: " + HexTool.getOpcodeToString(recv.getValue())); } } for (String header : headers) { if (sb.length() > 10000) { sb.append("\r\nThere were too many results, and could not display all of them."); break; } sb.append(header); //c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, headers.toString(), "00 00", (byte) 0, 9010000)); //c.getPlayer().dropMessage(6, header); } } else { c.getPlayer().dropMessage(6, "Sorry, that search call is unavailable"); } c.getSession().write(NPCPacket.getNPCTalk(9010000, (byte) 0, sb.toString(), "00 00", (byte) 0, 9010000)); } return 0; } } public static class ID extends Find { } public static class LookUp extends Find { } public static class Search extends Find { } public static class WhosFirst extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { //probably bad way to do it final long currentTime = System.currentTimeMillis(); List<Pair<String, Long>> players = new ArrayList<>(); for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) { if (!chr.isIntern()) { players.add(new Pair<>(MapleCharacterUtil.makeMapleReadable(chr.getName()) + (currentTime - chr.getCheatTracker().getLastAttack() > 600000 ? " (AFK)" : ""), chr.getChangeTime())); } } Collections.sort(players, new WhoComparator()); StringBuilder sb = new StringBuilder("List of people in this map in order, counting AFK (10 minutes): "); for (Pair<String, Long> z : players) { sb.append(z.left).append(", "); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } public static class WhoComparator implements Comparator<Pair<String, Long>>, Serializable { @Override public int compare(Pair<String, Long> o1, Pair<String, Long> o2) { if (o1.right > o2.right) { return 1; } else if (Objects.equals(o1.right, o2.right)) { return 0; } else { return -1; } } } } public static class WhosLast extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { StringBuilder sb = new StringBuilder("whoslast [type] where type can be: "); for (MapleSquadType t : MapleSquadType.values()) { sb.append(t.name()).append(", "); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } final MapleSquadType t = MapleSquadType.valueOf(splitted[1].toLowerCase()); if (t == null) { StringBuilder sb = new StringBuilder("whoslast [type] where type can be: "); for (MapleSquadType z : MapleSquadType.values()) { sb.append(z.name()).append(", "); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } if (t.queuedPlayers.get(c.getChannel()) == null) { c.getPlayer().dropMessage(6, "The queue has not been initialized in this channel yet."); return 0; } c.getPlayer().dropMessage(6, "Queued players: " + t.queuedPlayers.get(c.getChannel()).size()); StringBuilder sb = new StringBuilder("List of participants: "); for (Pair<String, String> z : t.queuedPlayers.get(c.getChannel())) { sb.append(z.left).append('(').append(z.right).append(')').append(", "); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } } public static class WhosNext extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { StringBuilder sb = new StringBuilder("whosnext [type] where type can be: "); for (MapleSquadType t : MapleSquadType.values()) { sb.append(t.name()).append(", "); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } final MapleSquadType t = MapleSquadType.valueOf(splitted[1].toLowerCase()); if (t == null) { StringBuilder sb = new StringBuilder("whosnext [type] where type can be: "); for (MapleSquadType z : MapleSquadType.values()) { sb.append(z.name()).append(", "); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } if (t.queue.get(c.getChannel()) == null) { c.getPlayer().dropMessage(6, "The queue has not been initialized in this channel yet."); return 0; } c.getPlayer().dropMessage(6, "Queued players: " + t.queue.get(c.getChannel()).size()); StringBuilder sb = new StringBuilder("List of participants: "); final long now = System.currentTimeMillis(); for (Pair<String, Long> z : t.queue.get(c.getChannel())) { sb.append(z.left).append('(').append(StringUtil.getReadableMillis(z.right, now)).append(" ago),"); } c.getPlayer().dropMessage(6, sb.toString().substring(0, sb.length() - 2)); return 0; } } public static class ItemVac extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final List<MapleMapObject> items = c.getPlayer().getMap().getMapObjectsInRange(c.getPlayer().getPosition(), GameConstants.maxViewRangeSq(), Arrays.asList(MapleMapObjectType.ITEM)); MapleMapItem mapitem; for (MapleMapObject item : items) { mapitem = (MapleMapItem) item; if (mapitem.getMeso() > 0) { c.getPlayer().gainMeso(mapitem.getMeso(), true); } else if (mapitem.getItem() == null || !MapleInventoryManipulator.addFromDrop(c, mapitem.getItem(), true)) { continue; } mapitem.setPickedUp(true); c.getPlayer().getMap().broadcastMessage(CField.removeItemFromMap(mapitem.getObjectId(), 2, c.getPlayer().getId()), mapitem.getPosition()); c.getPlayer().getMap().removeMapObject(item); } return 1; } } public static class CancelBuffs extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().cancelAllBuffs(); return 1; } } 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 FakeRelog extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().fakeRelog(); return 1; } } public static class Fly extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { SkillFactory.getSkill(1146).getEffect(1).applyTo(c.getPlayer()); SkillFactory.getSkill(1142).getEffect(1).applyTo(c.getPlayer()); c.getPlayer().dispelBuff(1146); return 1; } } public static class OpenNpc extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { NPCScriptManager.getInstance().start(c, Integer.parseInt(splitted[1]), splitted.length > 2 ? StringUtil.joinStringFrom(splitted, 2) : splitted[1]); return 1; } } public static class OpenShop extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleShopFactory.getInstance().getShop(Integer.parseInt(splitted[1])); return 1; } } public static class Shop extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleShopFactory shop = MapleShopFactory.getInstance(); int shopId = Integer.parseInt(splitted[1]); if (shop.getShop(shopId) != null) { shop.getShop(shopId).sendShop(c); } return 1; } } public static class ActiveBomberman extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter player = c.getPlayer(); if (player.getMapId() != 109010100) { player.dropMessage(5, "This command is only usable in map 109010100."); } else { c.getChannelServer().toggleBomberman(c.getPlayer()); for (MapleCharacter chr : player.getMap().getCharacters()) { if (!chr.isIntern()) { chr.cancelAllBuffs(); chr.giveDebuff(MapleDisease.SEAL, MobSkillFactory.getMobSkill(120, 1)); //MapleInventoryManipulator.removeById(chr.getClient(), MapleInventoryType.USE, 2100067, chr.getItemQuantity(2100067, false), true, true); //chr.gainItem(2100067, 30); //MapleInventoryManipulator.removeById(chr.getClient(), MapleInventoryType.ETC, 4031868, chr.getItemQuantity(4031868, false), true, true); //chr.gainItem(4031868, (short) 5); //chr.dropMessage(0, "You have been granted 5 jewels(lifes) and 30 bombs."); //chr.dropMessage(0, "Pick up as many bombs and jewels as you can!"); //chr.dropMessage(0, "Check inventory for Bomb under use"); } } for (MapleCharacter chrs : c.getChannelServer().getPlayerStorage().getAllCharacters()) { chrs.getClient().getSession().write(CWvsContext.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 22, c.getChannel(), "Event : Bomberman event has started!")); } player.getMap().broadcastMessage(CField.getClock(60)); } 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 DeactiveBomberman extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter player = c.getPlayer(); if (player.getMapId() != 109010100) { player.dropMessage(5, "This command is only usable in map 109010100."); } else { c.getChannelServer().toggleBomberman(c.getPlayer()); int count = 0; String winner = ""; for (MapleCharacter chr : player.getMap().getCharacters()) { if (!chr.isGM()) { if (count == 0) { winner = chr.getName(); count++; } else { winner += " , " + chr.getName(); } } } for (MapleCharacter chrs : c.getChannelServer().getPlayerStorage().getAllCharacters()) { chrs.getClient().getSession().write(CWvsContext.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 22, c.getChannel(), "Event : Bomberman event has ended! The winners are: " + winner)); } } return 1; } } public static class ClearInv extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter player = c.getPlayer(); if (splitted.length < 2 || player.hasBlockedInventory()) { c.getPlayer().dropMessage(5, "!clearinv <eq / use / setup / etc / cash / all >"); return 0; } else { MapleInventoryType type; if (splitted[1].equalsIgnoreCase("eq")) { type = MapleInventoryType.EQUIP; } else if (splitted[1].equalsIgnoreCase("use")) { type = MapleInventoryType.USE; } else if (splitted[1].equalsIgnoreCase("setup")) { type = MapleInventoryType.SETUP; } else if (splitted[1].equalsIgnoreCase("etc")) { type = MapleInventoryType.ETC; } else if (splitted[1].equalsIgnoreCase("cash")) { type = MapleInventoryType.CASH; } else if (splitted[1].equalsIgnoreCase("all")) { type = null; } else { c.getPlayer().dropMessage(5, "Invalid. @clearslot <eq / use / setup / etc / cash / all >"); return 0; } if (type == null) { //All, a bit hacky, but it's okay MapleInventoryType[] invs = {MapleInventoryType.EQUIP, MapleInventoryType.USE, MapleInventoryType.SETUP, MapleInventoryType.ETC, MapleInventoryType.CASH}; for (MapleInventoryType t : invs) { type = t; MapleInventory inv = c.getPlayer().getInventory(type); byte start = -1; for (byte i = 0; i < inv.getSlotLimit(); i++) { if (inv.getItem(i) != null) { start = i; break; } } if (start == -1) { c.getPlayer().dropMessage(5, "There are no items in that inventory."); return 0; } int end = 0; for (byte i = start; i < inv.getSlotLimit(); i++) { if (inv.getItem(i) != null) { MapleInventoryManipulator.removeFromSlot(c, type, i, inv.getItem(i).getQuantity(), true); } else { end = i; break;//Break at first empty space. } } c.getPlayer().dropMessage(5, "Cleared slots " + start + " to " + end + "."); } } else { MapleInventory inv = c.getPlayer().getInventory(type); byte start = -1; for (byte i = 0; i < inv.getSlotLimit(); i++) { if (inv.getItem(i) != null) { start = i; break; } } if (start == -1) { c.getPlayer().dropMessage(5, "There are no items in that inventory."); return 0; } byte end = 0; for (byte i = start; i < inv.getSlotLimit(); i++) { if (inv.getItem(i) != null) { MapleInventoryManipulator.removeFromSlot(c, type, i, inv.getItem(i).getQuantity(), true); } else { end = i; break;//Break at first empty space. } } c.getPlayer().dropMessage(5, "Cleared slots " + start + " to " + end + "."); } return 1; } } } public static class Bob extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleMonster mob = MapleLifeFactory.getMonster(9400551); for (int i = 0; i < 10; i++) { c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition()); } return 1; } } public static class StartAutoEvent extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final EventManager em = c.getChannelServer().getEventSM().getEventManager("AutomatedEvent"); if (em != null) { em.setWorldEvent(); em.scheduleRandomEvent(); System.out.println("Scheduling Random Automated Event."); } else { System.out.println("Could not locate Automated Event script."); } return 1; } } public static class CloneMe extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().cloneLook(); return 1; } } public static class DisposeClones extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dropMessage(6, c.getPlayer().getCloneSize() + " clones disposed."); c.getPlayer().disposeClones(); return 1; } } public static class ChatType extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { try { c.getPlayer().setChatType(c.getPlayer().getChatType() == 0 ? (short) 11 : 0); c.getPlayer().dropMessage(0, "Text colour has successfully changed."); } catch (Exception e) { c.getPlayer().dropMessage(0, "An error has occured."); } return 1; } } }