/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package server.commands; import client.*; import client.anticheat.ReportType; import client.inventory.*; 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.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.List; import scripting.EventInstanceManager; import scripting.EventManager; import scripting.NPCScriptManager; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MaplePortal; import server.commands.GMCommand.Ban; import server.commands.GMCommand.TempBan; import server.events.MapleEvent; import server.events.MapleEventType; import server.life.MapleLifeFactory; import server.life.MapleMonster; import server.life.MapleMonsterInformationProvider; import server.life.MapleNPC; import server.life.OverrideMonsterStats; import server.maps.MapleMap; import server.maps.MapleMapObject; import server.maps.MapleMapObjectType; import server.maps.MapleReactor; import server.quest.MapleQuest; import server.shops.MapleShopFactory; import tools.Pair; import tools.StringUtil; import tools.packet.CField; import tools.packet.CWvsContext; import tools.packet.CWvsContext.InventoryPacket; /** * * @author Emilyx3 */ public class GMCommand { public static PlayerGMRank getPlayerLevelRequired() { return PlayerGMRank.GM; } public static class Reports extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { List<CheaterData> cheaters = World.getReports(); 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 ClearReport extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { StringBuilder ret = new StringBuilder("report [ign] [all/"); for (ReportType type : ReportType.values()) { ret.append(type.theId).append('/'); } ret.setLength(ret.length() - 1); c.getPlayer().dropMessage(6, ret.append(']').toString()); return 0; } final MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (victim == null) { c.getPlayer().dropMessage(5, "Does not exist"); return 0; } final ReportType type = ReportType.getByString(splitted[2]); if (type != null) { victim.clearReports(type); } else { victim.clearReports(); } c.getPlayer().dropMessage(5, "Done."); return 1; } } public static class ClearDrops extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().removeDrops(); return 1; } } public static class Job extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int jobid = Integer.parseInt(splitted[1]); if (!MapleJob.isExist(jobid)) { c.getPlayer().dropMessage(5, "Invalid Job"); return 0; } c.getPlayer().changeJob((short) jobid); c.getPlayer().setSubcategory(c.getPlayer().getSubcategory()); return 1; } } public static class KillNear extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleMap map = c.getPlayer().getMap(); List<MapleMapObject> players = map.getMapObjectsInRange(c.getPlayer().getPosition(), (double) 25000, Arrays.asList(MapleMapObjectType.PLAYER)); for (MapleMapObject closeplayers : players) { MapleCharacter playernear = (MapleCharacter) closeplayers; if (playernear.isAlive() && playernear != c.getPlayer() && playernear.getJob() != 910) { playernear.setHp(0); playernear.updateSingleStat(MapleStat.HP, 0); playernear.dropMessage(5, "You were too close to the MapleGM."); } } return 1; } } public static class ManualEvent extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getChannelServer().manualEvent(c.getPlayer())) { for (MapleCharacter chrs : c.getChannelServer().getPlayerStorage().getAllCharacters()) { //chrs.dropMessage(0, "MapleGM is hosting an event! Use the @joinevent command to join the event!"); //chrs.dropMessage(0, "Event Map: " + c.getPlayer().getMap().getMapName()); //World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(25, 0, "MapleGM is hosting an event! Use the @joinevent command to join the event!")); //World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(26, 0, "Event Map: " + c.getPlayer().getMap().getMapName())); chrs.getClient().getSession().write(CWvsContext.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 25, c.getChannel(), "Event : MapleGM is hosting an event! Use the @joinevent command to join the event!")); chrs.getClient().getSession().write(CWvsContext.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 26, c.getChannel(), "Event : Event Channel: " + c.getChannel() + " Event Map: " + c.getPlayer().getMap().getMapName())); } } else { for (MapleCharacter chrs : c.getChannelServer().getPlayerStorage().getAllCharacters()) { //World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(22, 0, "Enteries to the GM event are closed. The event has began!")); chrs.getClient().getSession().write(CWvsContext.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 22, c.getChannel(), "Event : Enteries to the GM event are closed. The event has began!")); } } return 1; } } 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 (NumberFormatException 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; } } public static class KillAllDrops 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(), true, false, (byte) 1); } } 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 Position extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { Point position = c.getPlayer().getPosition(); c.getPlayer().dropMessage(6, "Your position is: " + position + "."); 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 { 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 TempBan extends CommandExecute { protected boolean ipBan = false; private final 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] [hours]"); 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 numHour = Integer.parseInt(splitted[3]); final Calendar cal = Calendar.getInstance(); cal.add(Calendar.HOUR, numHour); 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 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>"); c.getPlayer().dropMessage(5, "If you want to consider this ban as an autoban, set the reason \"AutoBan\""); 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()) && !target.getClient().isGm() && !target.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 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 { @Override 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 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 FlyPerson extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); SkillFactory.getSkill(1146).getEffect(1).applyTo(chr); SkillFactory.getSkill(1142).getEffect(1).applyTo(chr); chr.dispelBuff(1146); return 1; } } public static class FlyMap extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) { SkillFactory.getSkill(1146).getEffect(1).applyTo(mch); SkillFactory.getSkill(1142).getEffect(1).applyTo(mch); mch.dispelBuff(1146); } return 1; } } public static class GivePet extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 6) { c.getPlayer().dropMessage(0, splitted[0] + " <character name> <petid> <petname> <petlevel> <petcloseness> <petfullness>"); return 0; } MapleCharacter petowner = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); int id = Integer.parseInt(splitted[2]); String name = splitted[3]; int level = Integer.parseInt(splitted[4]); int closeness = Integer.parseInt(splitted[5]); int fullness = Integer.parseInt(splitted[6]); long period = 20000; short flags = 0; if (id >= 5001000 || id < 5000000) { c.getPlayer().dropMessage(0, "Invalid pet id."); return 0; } if (level > 30) { level = 30; } if (closeness > 30000) { closeness = 30000; } if (fullness > 100) { fullness = 100; } if (level < 1) { level = 1; } if (closeness < 0) { closeness = 0; } if (fullness < 0) { fullness = 0; } try { MapleInventoryManipulator.addById(petowner.getClient(), id, (short) 1, "", MaplePet.createPet(id, name, level, closeness, fullness, MapleInventoryIdentifier.getInstance(), id == 5000054 ? (int) period : 0, flags), 45, false, null); } catch (NullPointerException ex) { } 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 GetSkill extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { Skill skill = SkillFactory.getSkill(Integer.parseInt(splitted[1])); byte level = (byte) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1); byte masterlevel = (byte) CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1); if (level > skill.getMaxLevel()) { level = (byte) skill.getMaxLevel(); } if (masterlevel > skill.getMaxLevel()) { masterlevel = (byte) skill.getMaxLevel(); } c.getPlayer().changeSingleSkillLevel(skill, level, masterlevel); return 1; } } public static class Fame extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter player = c.getPlayer(); if (splitted.length < 2) { c.getPlayer().dropMessage(6, "Syntax: !fame <player> <amount>"); return 0; } MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); int fame; try { fame = Integer.parseInt(splitted[2]); } catch (NumberFormatException nfe) { c.getPlayer().dropMessage(6, "Invalid Number..."); return 0; } if (victim != null && player.allowedToTarget(victim)) { victim.addFame(fame); victim.updateSingleStat(MapleStat.FAME, victim.getFame()); } return 1; } } public static class SP extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().setRemainingSp(CommandProcessorUtil.getOptionalIntArg(splitted, 1, 1)); c.getPlayer().updateSingleStat(MapleStat.AVAILABLESP, 0); return 1; } } public static class SP2 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().setRemainingSp(CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1), Integer.parseInt(splitted[1])); c.getPlayer().updateSingleStat(MapleStat.AVAILABLESP, 0); return 1; } } public static class KillMap extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (MapleCharacter map : c.getPlayer().getMap().getCharactersThreadsafe()) { if (map != null && !map.isIntern()) { map.getStat().setHp((short) 0, map); map.getStat().setMp((short) 0, map); map.updateSingleStat(MapleStat.HP, 0); map.updateSingleStat(MapleStat.MP, 0); } } return 1; } } public static class JobPerson extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (!MapleJob.isExist(Integer.parseInt(splitted[2]))) { c.getPlayer().dropMessage(5, "Invalid Job"); return 0; } victim.changeJob((short) Integer.parseInt(splitted[2])); c.getPlayer().setSubcategory(c.getPlayer().getSubcategory()); 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 LevelUp extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().levelUp(); return 1; } } public static class LevelUpTill extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { //for (int i = 0; i < Integer.parseInt(splitted[1]) - c.getPlayer().getLevel(); i++) { while (c.getPlayer().getLevel() < Integer.parseInt(splitted[1])) { if (c.getPlayer().getLevel() < 255) { c.getPlayer().levelUp(); } } //} return 1; } } public static class LevelUpPersonTill extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); //for (int i = 0; i < Integer.parseInt(splitted[2]) - victim.getLevel(); i++) { while (victim.getLevel() < Integer.parseInt(splitted[2])) { if (victim.getLevel() < 255) { victim.levelUp(); } } //} return 1; } } public static class ITEM extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final int itemId = Integer.parseInt(splitted[1]); final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1); if (!c.getPlayer().isAdmin()) { for (int i : GameConstants.itemBlock) { if (itemId == i) { c.getPlayer().dropMessage(5, "Sorry but this item is blocked for your GM level."); return 0; } } } MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (!ii.itemExists(itemId)) { c.getPlayer().dropMessage(5, itemId + " does not exist"); } else { Item item; short flag = (short) ItemFlag.LOCK.getValue(); if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) { item = ii.getEquipById(itemId); } else { item = new Item(itemId, (byte) 0, quantity, (byte) 0); } //if (!c.getPlayer().isSuperGM()) { // item.setFlag(flag); //} if (!c.getPlayer().isAdmin()) { item.setOwner(c.getPlayer().getName()); item.setGMLog(c.getPlayer().getName() + " used !getitem"); } MapleInventoryManipulator.addbyItem(c, item); } return 1; } } public static class PotentialItem extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final int itemId = Integer.parseInt(splitted[1]); if (!c.getPlayer().isAdmin()) { for (int i : GameConstants.itemBlock) { if (itemId == i) { c.getPlayer().dropMessage(5, "Sorry but this item is blocked for your GM level."); return 0; } } } MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (itemId >= 2000000) { c.getPlayer().dropMessage(5, "You can only get equips."); } else if (!ii.itemExists(itemId)) { c.getPlayer().dropMessage(5, itemId + " does not exist"); } else { Equip equip; equip = ii.randomizeStats((Equip) ii.getEquipById(itemId)); equip.setPotential1(Integer.parseInt(splitted[2])); equip.setPotential2(Integer.parseInt(splitted[3])); equip.setPotential3(Integer.parseInt(splitted[4])); equip.setBonusPotential1(Integer.parseInt(splitted[5])); equip.setBonusPotential2(Integer.parseInt(splitted[6])); equip.setBonusPotential3(Integer.parseInt(splitted[7])); equip.setOwner(c.getPlayer().getName()); MapleInventoryManipulator.addbyItem(c, equip); } return 1; } } public static class ProItem extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (!c.getPlayer().isAdmin()) { return 0; } if (splitted.length < 3) { c.getPlayer().dropMessage(5, "!proitem id stats potential stats"); return 0; } final int itemId = Integer.parseInt(splitted[1]); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (itemId >= 2000000) { c.getPlayer().dropMessage(5, "You can only get equips."); } else if (!ii.itemExists(itemId)) { c.getPlayer().dropMessage(5, itemId + " does not exist"); } else { Equip equip; equip = ii.randomizeStats((Equip) ii.getEquipById(itemId)); equip.setStr(Short.parseShort(splitted[2])); equip.setDex(Short.parseShort(splitted[2])); equip.setInt(Short.parseShort(splitted[2])); equip.setLuk(Short.parseShort(splitted[2])); equip.setWatk(Short.parseShort(splitted[2])); equip.setMatk(Short.parseShort(splitted[2])); equip.setPotential1(Integer.parseInt(splitted[3])); equip.setPotential2(Integer.parseInt(splitted[3])); equip.setPotential3(Integer.parseInt(splitted[3])); equip.setOwner(c.getPlayer().getName()); MapleInventoryManipulator.addbyItem(c, equip); } return 1; } } public static class Level extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().setLevel(Short.parseShort(splitted[1])); c.getPlayer().updateSingleStat(MapleStat.LEVEL, Integer.parseInt(splitted[1])); c.getPlayer().setExp(0); return 1; } } public static class LevelPerson extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); victim.setLevel(Short.parseShort(splitted[2])); victim.updateSingleStat(MapleStat.LEVEL, Integer.parseInt(splitted[2])); victim.setExp(0); 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 SetEvent extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleEvent.onStartEvent(c.getPlayer()); return 1; } } public static class AutoEvent extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleEvent.onStartEvent(c.getPlayer()); return 1; } } public static class StartEvent extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getChannelServer().getEvent() == c.getPlayer().getMapId()) { MapleEvent.setEvent(c.getChannelServer(), false); c.getPlayer().dropMessage(5, "Started the event and closed off"); return 1; } else { c.getPlayer().dropMessage(5, "!event must've been done first, and you must be in the event map."); return 0; } } } public static class Event extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final MapleEventType type = MapleEventType.getByString(splitted[1]); if (type == null) { final StringBuilder sb = new StringBuilder("Wrong syntax: "); for (MapleEventType t : MapleEventType.values()) { sb.append(t.name()).append(","); } c.getPlayer().dropMessage(5, sb.toString().substring(0, sb.toString().length() - 1)); return 0; } final String msg = MapleEvent.scheduleEvent(type, c.getChannelServer()); if (msg.length() > 0) { c.getPlayer().dropMessage(5, msg); return 0; } return 1; } } public static class RemoveItem extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, "Need <name> <itemid>"); return 0; } MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (chr == null) { c.getPlayer().dropMessage(6, "This player does not exist"); return 0; } chr.removeAll(Integer.parseInt(splitted[2]), false); c.getPlayer().dropMessage(6, "All items with the ID " + splitted[2] + " has been removed from the inventory of " + splitted[1] + "."); return 1; } } public static class LockItem extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, "Need <name> <itemid>"); return 0; } MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (chr == null) { c.getPlayer().dropMessage(6, "This player does not exist"); return 0; } int itemid = Integer.parseInt(splitted[2]); MapleInventoryType type = GameConstants.getInventoryType(itemid); for (Item item : chr.getInventory(type).listById(itemid)) { item.setFlag((byte) (item.getFlag() | ItemFlag.LOCK.getValue())); chr.getClient().getSession().write(InventoryPacket.updateSpecialItemUse(item, type.getType(), item.getPosition(), true, chr)); } if (type == MapleInventoryType.EQUIP) { type = MapleInventoryType.EQUIPPED; for (Item item : chr.getInventory(type).listById(itemid)) { item.setFlag((byte) (item.getFlag() | ItemFlag.LOCK.getValue())); //chr.getClient().getSession().write(CField.updateSpecialItemUse(item, type.getType())); } } c.getPlayer().dropMessage(6, "All items with the ID " + splitted[2] + " has been locked from the inventory of " + splitted[1] + "."); return 1; } } public static class Smega extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { World.Broadcast.broadcastSmega(CWvsContext.broadcastMsg(3, c.getPlayer() == null ? c.getChannel() : c.getPlayer().getClient().getChannel(), c.getPlayer() == null ? c.getPlayer().getName() : c.getPlayer().getName() + " : " + StringUtil.joinStringFrom(splitted, 1), true)); /*if (splitted.length < 2) { c.getPlayer().dropMessage(0, "!smega <itemid> <message>"); return 0; } final List<String> lines = new LinkedList<>(); for (int i = 0; i < 4; i++) { final String text = StringUtil.joinStringFrom(splitted, 2); if (text.length() > 55) { continue; } lines.add(text); } final boolean ear = true; World.Broadcast.broadcastSmega(CWvsContext.getAvatarMega(c.getPlayer(), c.getChannel(), Integer.parseInt(splitted[1]), lines, ear)); */ return 1; } } public static class SpeakMega extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (victim == null) { c.getPlayer().dropMessage(0, "The person isn't login, or doesn't exists."); return 0; } World.Broadcast.broadcastSmega(CWvsContext.broadcastMsg(3, victim.getClient().getChannel(), victim.getName() + " : " + StringUtil.joinStringFrom(splitted, 2), true)); /* if (splitted.length < 2) { c.getPlayer().dropMessage(0, "!smega <itemid> <victim> <message>"); return 0; } final List<String> lines = new LinkedList<>(); for (int i = 0; i < 4; i++) { final String text = StringUtil.joinStringFrom(splitted, 3); if (text.length() > 55) { continue; } lines.add(text); } final boolean ear = true; World.Broadcast.broadcastSmega(CWvsContext.getAvatarMega(victim, victim.getClient().getChannel(), Integer.parseInt(splitted[1]), lines, ear)); */ return 1; } } public static class SpeakAll extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) { if (mch == null) { return 0; } else { mch.getMap().broadcastMessage(CField.getChatText(mch.getId(), StringUtil.joinStringFrom(splitted, 1), mch.isGM(), 0)); } } return 1; } } public static class Speak extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (victim == null) { c.getPlayer().dropMessage(5, "unable to find '" + splitted[1]); return 0; } else { victim.getMap().broadcastMessage(CField.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 2), victim.isGM(), 0)); } return 1; } } public static class DiseaseMap extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, "!disease <type> <level> where type = SEAL/DARKNESS/WEAKEN/STUN/CURSE/POISON/SLOW/SEDUCE/REVERSE/ZOMBIFY/POTION/SHADOW/BLIND/FREEZE/POTENTIAL"); return 0; } int type; if (splitted[1].equalsIgnoreCase("SEAL")) { type = 120; } else if (splitted[1].equalsIgnoreCase("DARKNESS")) { type = 121; } else if (splitted[1].equalsIgnoreCase("WEAKEN")) { type = 122; } else if (splitted[1].equalsIgnoreCase("STUN")) { type = 123; } else if (splitted[1].equalsIgnoreCase("CURSE")) { type = 124; } else if (splitted[1].equalsIgnoreCase("POISON")) { type = 125; } else if (splitted[1].equalsIgnoreCase("SLOW")) { type = 126; } else if (splitted[1].equalsIgnoreCase("SEDUCE")) { //24, 289 and 29 are cool. type = 128; } else if (splitted[1].equalsIgnoreCase("REVERSE")) { type = 132; } else if (splitted[1].equalsIgnoreCase("ZOMBIFY")) { type = 133; } else if (splitted[1].equalsIgnoreCase("POTION")) { type = 134; } else if (splitted[1].equalsIgnoreCase("SHADOW")) { type = 135; } else if (splitted[1].equalsIgnoreCase("BLIND")) { type = 136; } else if (splitted[1].equalsIgnoreCase("FREEZE")) { type = 137; } else if (splitted[1].equalsIgnoreCase("POTENTIAL")) { type = 138; } else if (splitted[1].equalsIgnoreCase("SLOW2")) { type = 172; } else if (splitted[1].equalsIgnoreCase("TORNADO")) { type = 173; } else if (splitted[1].equalsIgnoreCase("FLAG")) { type = 799; } else { c.getPlayer().dropMessage(6, "!disease <type> <level> where type = SEAL/DARKNESS/WEAKEN/STUN/CURSE/POISON/SLOW/SEDUCE/REVERSE/ZOMBIFY/POTION/SHADOW/BLIND/FREEZE/POTENTIAL/SLOW2/TORNADO/FLAG"); return 0; } for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) { if (mch.getMapId() == c.getPlayer().getMapId()) { if (splitted.length == 4) { if (mch == null) { c.getPlayer().dropMessage(5, "Not found."); return 0; } mch.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1)); } else { mch.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1)); } } } return 1; } } public static class Disease extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, "!disease <type> [charname] <level> where type = SEAL/DARKNESS/WEAKEN/STUN/CURSE/POISON/SLOW/SEDUCE/REVERSE/ZOMBIFY/POTION/SHADOW/BLIND/FREEZE/POTENTIAL"); return 0; } int type; if (splitted[1].equalsIgnoreCase("SEAL")) { type = 120; } else if (splitted[1].equalsIgnoreCase("DARKNESS")) { type = 121; } else if (splitted[1].equalsIgnoreCase("WEAKEN")) { type = 122; } else if (splitted[1].equalsIgnoreCase("STUN")) { type = 123; } else if (splitted[1].equalsIgnoreCase("CURSE")) { type = 124; } else if (splitted[1].equalsIgnoreCase("POISON")) { type = 125; } else if (splitted[1].equalsIgnoreCase("SLOW")) { type = 126; } else if (splitted[1].equalsIgnoreCase("SEDUCE")) { type = 128; } else if (splitted[1].equalsIgnoreCase("REVERSE")) { type = 132; } else if (splitted[1].equalsIgnoreCase("ZOMBIFY")) { type = 133; } else if (splitted[1].equalsIgnoreCase("POTION")) { type = 134; } else if (splitted[1].equalsIgnoreCase("SHADOW")) { type = 135; } else if (splitted[1].equalsIgnoreCase("BLIND")) { type = 136; } else if (splitted[1].equalsIgnoreCase("FREEZE")) { type = 137; } else if (splitted[1].equalsIgnoreCase("POTENTIAL")) { type = 138; } else if (splitted[1].equalsIgnoreCase("SLOW2")) { type = 172; } else if (splitted[1].equalsIgnoreCase("TORNADO")) { type = 173; } else if (splitted[1].equalsIgnoreCase("FLAG")) { type = 799; } else { c.getPlayer().dropMessage(6, "!disease <type> [charname] <level> where type = SEAL/DARKNESS/WEAKEN/STUN/CURSE/POISON/SLOW/SEDUCE/REVERSE/ZOMBIFY/POTION/SHADOW/BLIND/FREEZE/POTENTIAL/SLOW2/TORNADO/FLAG"); return 0; } if (splitted.length == 4) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[2]); if (victim == null) { c.getPlayer().dropMessage(5, "Not found."); return 0; } victim.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1)); } else { for (MapleCharacter victim : c.getPlayer().getMap().getCharactersThreadsafe()) { victim.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1)); } } 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 SetInstanceProperty extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { EventManager em = c.getChannelServer().getEventSM().getEventManager(splitted[1]); if (em == null || em.getInstances().size() <= 0) { c.getPlayer().dropMessage(5, "none"); } else { em.setProperty(splitted[2], splitted[3]); for (EventInstanceManager eim : em.getInstances()) { eim.setProperty(splitted[2], splitted[3]); } } return 1; } } public static class ListInstanceProperty extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { EventManager em = c.getChannelServer().getEventSM().getEventManager(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() + ", eventManager: " + em.getName() + " iprops: " + eim.getProperty(splitted[2]) + ", eprops: " + em.getProperty(splitted[2])); } } return 0; } } public static class LeaveInstance extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getPlayer().getEventInstance() == null) { c.getPlayer().dropMessage(5, "You are not in one"); } else { c.getPlayer().getEventInstance().unregisterPlayer(c.getPlayer()); } return 1; } } public static class WhosThere extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { StringBuilder builder = new StringBuilder("Players on Map: ").append(c.getPlayer().getMap().getCharactersThreadsafe().size()).append(", "); for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) { if (builder.length() > 150) { // wild guess :o builder.setLength(builder.length() - 2); c.getPlayer().dropMessage(6, builder.toString()); builder = new StringBuilder(); } builder.append(MapleCharacterUtil.makeMapleReadable(chr.getName())); builder.append(", "); } builder.setLength(builder.length() - 2); c.getPlayer().dropMessage(6, builder.toString()); return 1; } } public static class StartInstance extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getPlayer().getEventInstance() != null) { c.getPlayer().dropMessage(5, "You are in one"); } else if (splitted.length > 2) { EventManager em = c.getChannelServer().getEventSM().getEventManager(splitted[1]); if (em == null || em.getInstance(splitted[2]) == null) { c.getPlayer().dropMessage(5, "Not exist"); } else { em.getInstance(splitted[2]).registerPlayer(c.getPlayer()); } } else { c.getPlayer().dropMessage(5, "!startinstance [eventmanager] [eventinstance]"); } return 1; } } public static class ResetMobs extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().killAllMonsters(false); return 1; } } public static class KillMonsterByOID extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleMap map = c.getPlayer().getMap(); int targetId = Integer.parseInt(splitted[1]); MapleMonster monster = map.getMonsterByOid(targetId); if (monster != null) { map.killMonster(monster, c.getPlayer(), false, false, (byte) 1); } return 1; } } public static class RemoveNPCs extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().resetNPCs(); return 1; } } public static class GMChatNotice extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (MapleCharacter all : c.getChannelServer().getPlayerStorage().getAllCharacters()) { all.dropMessage(-6, StringUtil.joinStringFrom(splitted, 1)); } return 1; } } public static class Notice extends CommandExecute { protected static int getNoticeType(String typestring) { switch (typestring) { case "1": return -1; case "2": return -2; case "3": return -3; case "4": return -4; case "5": return -5; case "6": return -6; case "7": return -7; case "8": return -8; case "n": return 0; case "p": return 1; case "l": return 2; case "nv": return 5; case "v": return 5; case "b": return 6; } return -1; } @Override public int execute(MapleClient c, String[] splitted) { int joinmod = 1; int range = -1; switch (splitted[1]) { case "m": range = 0; break; case "c": range = 1; break; case "w": range = 2; break; } int tfrom = 2; if (range == -1) { range = 2; tfrom = 1; } int type = getNoticeType(splitted[tfrom]); if (type == -1) { type = 0; joinmod = 0; } StringBuilder sb = new StringBuilder(); if (splitted[tfrom].equals("nv")) { sb.append("[Notice]"); } else { sb.append(""); } joinmod += tfrom; sb.append(StringUtil.joinStringFrom(splitted, joinmod)); byte[] packet = CWvsContext.broadcastMsg(type, sb.toString()); if (range == 0) { c.getPlayer().getMap().broadcastMessage(packet); } else if (range == 1) { ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet); } else if (range == 2) { World.Broadcast.broadcastMessage(packet); } return 1; } } public static class Yellow extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int range = -1; switch (splitted[1]) { case "m": range = 0; break; case "c": range = 1; break; case "w": range = 2; break; } if (range == -1) { range = 2; } byte[] packet = CWvsContext.yellowChat((splitted[0].equals("!y") ? ("[" + c.getPlayer().getName() + "] ") : "") + StringUtil.joinStringFrom(splitted, 2)); if (range == 0) { c.getPlayer().getMap().broadcastMessage(packet); } else if (range == 1) { ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet); } else if (range == 2) { World.Broadcast.broadcastMessage(packet); } return 1; } } public static class Y extends Yellow { } public static class WhatsMyIP extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dropMessage(5, "IP: " + c.getSession().getRemoteAddress().toString().split(":")[0]); return 1; } } public static class TempBanIP extends TempBan { public TempBanIP() { ipBan = true; } } public static class BanIP extends Ban { public BanIP() { ipBan = true; } } public static class TDrops extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().toggleDrops(); 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 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 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; int 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(); splitString = splitString.toUpperCase(); for (int i = 0; i < splitString.length(); ++i) { char chr = splitString.charAt(i); if (chr == ' ') { chars.add(Integer.valueOf(-1)); } else if ((chr >= 'A') && (chr <= 'Z')) { chars.add(Integer.valueOf(chr)); } else if ((chr >= '0') && (chr <= '9')) { chars.add(Integer.valueOf(chr + 200)); } } int w = 32; int dStart = c.getPlayer().getPosition().x - (splitString.length() / 2 * 32); for (Integer i : chars) { if (i.intValue() == -1) { dStart += 32; } else { int val; Item item; if (i.intValue() < 200) { val = start + i.intValue() - 65; item = new 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 += 32; } else if ((i.intValue() >= 200) && (i.intValue() <= 300)) { val = nstart + i.intValue() - 48 - 200; item = new 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 += 32; } } } return 1; } } public static class Spawn extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final int mid = Integer.parseInt(splitted[1]); final int num = Math.min(CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1), 500); Integer level = CommandProcessorUtil.getNamedIntArg(splitted, 1, "lvl"); Long hp = CommandProcessorUtil.getNamedLongArg(splitted, 1, "hp"); Integer exp = CommandProcessorUtil.getNamedIntArg(splitted, 1, "exp"); Double php = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "php"); Double pexp = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "pexp"); MapleMonster onemob; try { onemob = MapleLifeFactory.getMonster(mid); } catch (RuntimeException e) { c.getPlayer().dropMessage(5, "Error: " + e.getMessage()); return 0; } if (onemob == null) { c.getPlayer().dropMessage(5, "Mob does not exist"); return 0; } long newhp; int newexp; if (hp != null) { newhp = hp.longValue(); } else if (php != null) { newhp = (long) (onemob.getMobMaxHp() * (php.doubleValue() / 100)); } else { newhp = onemob.getMobMaxHp(); } if (exp != null) { newexp = exp.intValue(); } else if (pexp != null) { newexp = (int) (onemob.getMobExp() * (pexp.doubleValue() / 100)); } else { newexp = onemob.getMobExp(); } if (newhp < 1) { newhp = 1; } final OverrideMonsterStats overrideStats = new OverrideMonsterStats(newhp, onemob.getMobMaxMp(), newexp, false); for (int i = 0; i < num; i++) { MapleMonster mob = MapleLifeFactory.getMonster(mid); mob.setHp(newhp); if (level != null) { mob.changeLevel(level.intValue(), false); } else { mob.setOverrideStats(overrideStats); } c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition()); } return 1; } } public static class SpawnMob extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { final String mname = splitted[2]; final int num = Integer.parseInt(splitted[1]); int mid = 0; for (Pair<Integer, String> mob : MapleMonsterInformationProvider.getInstance().getAllMonsters()) { if (mob.getRight().toLowerCase().equals(mname.toLowerCase())) { mid = mob.getLeft(); break; } } MapleMonster onemob; try { onemob = MapleLifeFactory.getMonster(mid); } catch (RuntimeException e) { c.getPlayer().dropMessage(5, "Error: " + e.getMessage()); return 0; } if (onemob == null) { c.getPlayer().dropMessage(5, "Mob does not exist"); return 0; } for (int i = 0; i < num; i++) { MapleMonster mob = MapleLifeFactory.getMonster(mid); c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition()); } return 1; } } public static class Mute extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); victim.canTalk(false); return 1; } } public static class UnMute extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); victim.canTalk(true); return 1; } } public static class MuteMap extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) { chr.canTalk(false); } return 1; } } public static class UnMuteMap extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) { chr.canTalk(true); } return 1; } } }