/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package server.commands; import client.*; import client.inventory.*; import constants.GameConstants; import handling.channel.ChannelServer; import handling.world.World; import java.awt.Point; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import scripting.EventInstanceManager; import scripting.EventManager; import scripting.NPCScriptManager; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MaplePortal; import server.MapleStatEffect; import server.MapleStatInfo; import server.commands.InternCommand.封號; import server.commands.InternCommand.臨時封號; 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.MapleReactor; import server.quest.MapleQuest; import server.shops.MapleShopFactory; import tools.FileoutputUtil; 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 玩家飛 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 全圖飛 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 給予寵物 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 7) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <寵物道具ID> <寵物名稱> <寵物等級> <寵物親密度> <寵物飢餓感>"); 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, "寵物道具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, 0), 45, MapleInventoryManipulator.DAY, c.getPlayer().getName() + "使用" + splitted[0] + "指令製作"); } catch (NullPointerException ex) { } return 1; } } public static class 獲得技能 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <技能ID> (技能等級:默認1) (技能最高等級:默認1)"); return 0; } 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 增加人氣 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter player = c.getPlayer(); if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <數量>"); 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, "數量無效..."); return 0; } if (victim != null && player.allowedToTarget(victim)) { victim.addFame(fame); victim.updateSingleStat(MapleStat.FAME, victim.getFame()); } return 1; } } public static class 技能點 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 轉數技能點 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <轉職次數> <技能點數>"); return 0; } c.getPlayer().setRemainingSp(CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1), Integer.parseInt(splitted[1]) - 1); c.getPlayer().updateSingleStat(MapleStat.AVAILABLESP, 0); return 1; } } public static class 職業 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <職業ID>"); return 0; } int jobid = Integer.parseInt(splitted[1]); if (!MapleJob.isExist(jobid)) { c.getPlayer().dropMessage(5, "職業ID無效"); return 0; } c.getPlayer().changeJob((short) jobid); c.getPlayer().setSubcategory(c.getPlayer().getSubcategory()); return 1; } } public static class 玩家職業 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <職業ID>"); return 0; } MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (!MapleJob.isExist(Integer.parseInt(splitted[2]))) { c.getPlayer().dropMessage(5, "職業ID無效"); return 0; } victim.changeJob((short) Integer.parseInt(splitted[2])); c.getPlayer().setSubcategory(c.getPlayer().getSubcategory()); return 1; } } public static class 商店 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <商店ID>"); return 0; } 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 升級 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getPlayer().getLevel() < 250) { c.getPlayer().gainExp(c.getPlayer().getNeededExp() - c.getPlayer().getExp(), true, false, true); } return 1; } } public static class 升級到 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <等級>"); return 0; } //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() < 250) { c.getPlayer().gainExp(c.getPlayer().getNeededExp() - c.getPlayer().getExp(), true, false, true); } } //} return 1; } } public static class 升級玩家到 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <等级>"); return 0; } 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() < 250) { victim.gainExp(c.getPlayer().getNeededExp() - c.getPlayer().getExp(), true, false, true); } } //} return 1; } } public static class 製作潛能道具 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 8) { c.getPlayer().dropMessage(6, splitted[0] + " <道具ID> <第一潛能> <第二潛能> <第三潛能> <第一附加潛能> <第二附加潛能> <第三附加潛能>"); return 0; } final int itemId = Integer.parseInt(splitted[1]); if (!c.getPlayer().isAdmin()) { for (int i : GameConstants.itemBlock) { if (itemId == i) { c.getPlayer().dropMessage(5, "當前管理員等級沒有製作此道具的權限"); return 0; } } } short flag = (short) ItemFlag.LOCK.getValue(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (itemId >= 2000000) { c.getPlayer().dropMessage(5, "道具ID必須為裝備"); } else if (!ii.itemExists(itemId)) { c.getPlayer().dropMessage(5, "道具不存在"); } else { Equip equip; equip = ii.randomizeStats((Equip) ii.getEquipById(itemId)); equip.setPotential(Integer.parseInt(splitted[2]), 1, false); equip.setPotential(Integer.parseInt(splitted[3]), 2, false); equip.setPotential(Integer.parseInt(splitted[4]), 3, false); equip.updateState(false); equip.setPotential(Integer.parseInt(splitted[5]), 1, true); equip.setPotential(Integer.parseInt(splitted[6]), 2, true); equip.setPotential(Integer.parseInt(splitted[7]), 3, true); equip.updateState(true); equip.setGMLog(c.getPlayer().getName() + " 使用 " + splitted[0] + " 指令製作, 時間:" + FileoutputUtil.CurrentReadable_Time()); if (!c.getPlayer().isGM()) { equip.setFlag(flag); } if (!c.getPlayer().isAdmin()) { equip.setOwner(c.getPlayer().getName()); } MapleInventoryManipulator.addbyItem(c, equip); } return 1; } } public static class 製作屬性道具 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (!c.getPlayer().isAdmin()) { return 0; } if (splitted.length < 4) { c.getPlayer().dropMessage(6, splitted[0] + " <道具ID> <屬性值> <潛能>"); return 0; } final int itemId = Integer.parseInt(splitted[1]); short flag = (short) ItemFlag.LOCK.getValue(); MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (itemId >= 2000000) { c.getPlayer().dropMessage(5, "道具ID必須為裝備"); } else if (!ii.itemExists(itemId)) { c.getPlayer().dropMessage(5, "道具不存在"); } 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.setPotential(Integer.parseInt(splitted[3]), 1, false); equip.setPotential(Integer.parseInt(splitted[3]), 2, false); equip.setPotential(Integer.parseInt(splitted[3]), 3, false); equip.updateState(false); equip.setGMLog(c.getPlayer().getName() + " 使用 " + splitted[0] + " 指令製作, 時間:" + FileoutputUtil.CurrentReadable_Time()); if (!c.getPlayer().isGM()) { equip.setFlag(flag); } if (!c.getPlayer().isAdmin()) { equip.setOwner(c.getPlayer().getName()); } MapleInventoryManipulator.addbyItem(c, equip); } return 1; } } public static class 等級 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <等級>"); return 0; } 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 玩家等級 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 開始自動事件 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("正在進行隨機自動事件"); } else { System.out.println("找不到AutomatedEvent腳本"); } return 1; } } public static class 設置事件 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleEvent.onStartEvent(c.getPlayer()); return 1; } } public static class 自動事件 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleEvent.onStartEvent(c.getPlayer()); return 1; } } public static class 開始事件 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, "此指令必須在事件地圖才能使用"); return 0; } } } public static class 事件 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <腳本名>"); return 0; } 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 清除玩家道具 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <道具ID>"); return 0; } MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (chr == null) { c.getPlayer().dropMessage(6, "玩家不存在"); return 0; } chr.removeAll(Integer.parseInt(splitted[2]), false); c.getPlayer().dropMessage(6, "玩家 " + splitted[1] + " 所有的道具(ID:" + splitted[2] + ")已被清除"); return 1; } } public static class 封印道具 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <道具ID>"); return 0; } MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (chr == null) { c.getPlayer().dropMessage(6, "找不到角色"); 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, "已將ID為 " + splitted[2] + " 的所有道具鎖定, 被執行角色 " + 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 線上說話 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 玩家說話 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <內容>"); return 0; } MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); if (victim == null) { c.getPlayer().dropMessage(5, "找不到玩家:" + splitted[1]); return 0; } else { victim.getMap().broadcastMessage(CField.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 2), victim.isGM(), 0)); } return 1; } } public static class 全圖異常狀態 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int type = -1; for (MapleDisease disease : MapleDisease.values()) { if (splitted.length < 2) { break; } if (disease.name().equalsIgnoreCase(splitted[1])) { type = disease.getValue(); break; } } if (type < 0) { StringBuilder sb = new StringBuilder(""); for (MapleDisease disease : MapleDisease.values()) { sb.append(disease.name()).append("/"); } c.getPlayer().dropMessage(6, splitted[0] + " <類型> (等級:默認1) where 類型 = " + sb.toString()); return 0; } for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) { if (mch.getMapId() == c.getPlayer().getMapId()) { mch.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1)); } } return 1; } } public static class 玩家異常狀態 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int type = -1; for (MapleDisease disease : MapleDisease.values()) { if (splitted.length < 3) { break; } if (disease.name().equalsIgnoreCase(splitted[1])) { type = disease.getValue(); break; } } if (type < 0) { StringBuilder sb = new StringBuilder(""); for (MapleDisease disease : MapleDisease.values()) { sb.append(disease.name()).append("/"); } c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <類型> (等級:默認1) where 類型 = " + sb.toString()); return 0; } MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[2]); if (victim == null) { c.getPlayer().dropMessage(5, "未找到玩家"); return 0; } victim.disease(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1)); return 1; } } public static class 克隆我 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().cloneLook(); return 1; } } public static class 清除克隆 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dropMessage(6, c.getPlayer().getCloneSize() + " 個克隆被清除了"); c.getPlayer().disposeClones(); return 1; } } public static class 全圖玩家 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { StringBuilder builder = new StringBuilder("當前地圖的玩家: 總共").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 設置事件實例屬性 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, "事件實例不存在"); } else { em.setProperty(splitted[2], splitted[3]); for (EventInstanceManager eim : em.getInstances()) { eim.setProperty(splitted[2], splitted[3]); } } return 1; } } public static class 事件實例屬性 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 離開事件實例 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getPlayer().getEventInstance() == null) { c.getPlayer().dropMessage(5, "你沒有在事件實例中"); } else { c.getPlayer().getEventInstance().unregisterPlayer(c.getPlayer()); } return 1; } } public static class 開始事件實例 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (c.getPlayer().getEventInstance() != null) { c.getPlayer().dropMessage(5, "你已在一個事件實例中"); } 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, "不存在"); } else { em.getInstance(splitted[2]).registerPlayer(c.getPlayer()); } } else { c.getPlayer().dropMessage(5, splitted[0] + " [eventmanager] [eventinstance]"); } return 1; } } public static class 殺OID怪物 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <怪物OID>"); return 0; } 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 重置怪物 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().killAllMonsters(false); return 1; } } public static class 重置NPC extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().resetNPCs(); return 1; } } public static class 聊天公告 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 公告事項 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) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " (對象:默認w) (類型:默認0) <公告內容>"); c.getPlayer().dropMessage(6, splitted[0] + "對象:地圖所有人 - m/頻道所有人 - c/伺服器所有人 - w"); c.getPlayer().dropMessage(6, splitted[0] + "類型:1/2/3/4/5/6/7/8/n/彈窗 - p/頻道廣播 - l/紅字[公告事項] - nv/紅字 - v/无[公告事項] - b"); return 0; } 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("[公告事項]"); } 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 我的IP 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 臨時封IP extends 臨時封號 { public 臨時封IP() { ipBan = true; } } public static class 封IP extends 封號 { public 封IP() { ipBan = true; } } public static class 掉寶開關 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().getMap().toggleDrops(); return 1; } } public static class 監禁 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱> <時間(分鐘,0為永久)>"); 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, "請到此玩家所在的頻道"); return 0; } return 1; } } public static class 查看NPC 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() + " 坐標: " + reactor2l.getPosition().toString() + " 名稱: " + reactor2l.getName()); } return 0; } } public static class 查看反應堆 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, "反應堆: oID: " + reactor2l.getObjectId() + " 反應堆ID: " + reactor2l.getReactorId() + " 坐標: " + reactor2l.getPosition().toString() + " 狀態: " + reactor2l.getState() + " 名稱: " + reactor2l.getName()); } return 0; } } public static class 查看傳送點 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (MaplePortal portal : c.getPlayer().getMap().getPortals()) { c.getPlayer().dropMessage(5, "傳送點: ID: " + portal.getId() + " 腳本: " + portal.getScriptName() + " 名稱: " + portal.getName() + " 坐標: " + portal.getPosition().x + "," + portal.getPosition().y + " 目標地圖: " + portal.getTargetMapId() + " / " + portal.getTarget()); } return 0; } } public static class 我的位置 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 字母 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(6, splitted[0] + " <顏色 (綠/紅)> <單詞>"); return 0; } int start; int nstart; if (splitted[1].equalsIgnoreCase("綠")) { start = 3991026; nstart = 3990019; } else if (splitted[1].equalsIgnoreCase("紅")) { start = 3991000; nstart = 3990009; } else { c.getPlayer().dropMessage(6, "未知顏色"); 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(-1); } else if ((chr >= 'A') && (chr <= 'Z')) { chars.add(Integer.valueOf(chr)); } else if ((chr >= '0') && (chr <= '9')) { chars.add(chr + 200); } } int w = 32; int dStart = c.getPlayer().getPosition().x - (splitString.length() / 2 * 32); for (Integer i : chars) { if (i == -1) { dStart += 32; } else { int val; Item item; if (i < 200) { val = start + i - 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 >= 200) && (i <= 300)) { val = nstart + i - 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 召喚 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <怪物ID> (數量:默認1)"); return 0; } 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, "錯誤: " + e.getMessage()); return 0; } if (onemob == null) { c.getPlayer().dropMessage(5, "怪物不存在"); return 0; } int newhp; int newexp; if (hp != null) { newhp = hp.intValue(); } else if (php != null) { newhp = (int) (onemob.getMobMaxHp() * (php / 100)); } else { newhp = (int) onemob.getMobMaxHp(); } if (exp != null) { newexp = exp; } else if (pexp != null) { newexp = (int) (onemob.getMobExp() * (pexp / 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, false); } else { mob.setOverrideStats(overrideStats); } c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition()); } return 1; } } public static class 召喚怪物 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " (數量:默認1) <怪物名稱>"); return 0; } final String mname; final int num; if (splitted.length == 2) { mname = StringUtil.joinStringFrom(splitted, 1); num = 1; } else { mname = StringUtil.joinStringFrom(splitted, 2); num = Integer.parseInt(splitted[1]); } int mid = 0; for (Entry<Integer, String> mob : MapleMonsterInformationProvider.getInstance().getAllMonsters().entrySet()) { if (mob.getValue().toLowerCase().equals(mname.toLowerCase())) { mid = mob.getKey(); break; } } MapleMonster onemob; try { onemob = MapleLifeFactory.getMonster(mid); } catch (RuntimeException e) { c.getPlayer().dropMessage(5, "錯誤: " + e.getMessage()); return 0; } if (onemob == null) { c.getPlayer().dropMessage(5, "怪物不存在"); 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 禁言 extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱>"); return 0; } MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); victim.canTalk(false); return 1; } } public static class 取消禁言 extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <玩家名稱>"); return 0; } MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); victim.canTalk(true); return 1; } } public static class 全圖禁言 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 取消全圖禁言 extends CommandExecute { @Override public int execute(MapleClient c, String splitted[]) { for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) { chr.canTalk(true); } return 1; } } public static class 無敵 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleCharacter player = c.getPlayer(); if (player.isInvincible()) { player.setInvincible(false); player.dropMessage(6, "無敵模式關閉"); } else { player.setInvincible(true); player.dropMessage(6, "無敵模式開啟"); } return 1; } } public static class 線上玩家 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int total = 0; c.getPlayer().dropMessage(6, "---------------------------------------------------------------------------------------"); for (ChannelServer cserv : ChannelServer.getAllInstances()) { int curConnected = cserv.getConnectedClients(); c.getPlayer().dropMessage(6, new StringBuilder().append("頻道: ").append(cserv.getChannel()).append(" 線上人數: ").append(curConnected).toString()); total += curConnected; for (MapleCharacter chr : cserv.getPlayerStorage().getAllCharacters()) { if (chr != null && c.getPlayer().getGMLevel() >= chr.getGMLevel()) { StringBuilder ret = new StringBuilder(); ret.append(StringUtil.getRightPaddedStr(chr.getName(), ' ', 13)); ret.append(" ID: "); ret.append(chr.getId()); ret.append(" 等級: "); ret.append(StringUtil.getRightPaddedStr(String.valueOf(chr.getLevel()), ' ', 3)); if (chr.getMap() != null) { ret.append(" 地圖: "); ret.append(chr.getMap().toString()); } c.getPlayer().dropMessage(6, ret.toString()); } } } c.getPlayer().dropMessage(6, new StringBuilder().append("當前伺服器總計線上人數: ").append(total).toString()); c.getPlayer().dropMessage(6, "---------------------------------------------------------------------------------------"); return 1; } } public static class 搜外掛 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <搜尋訊息:進程名/MD5>"); return 0; } int i = 0; String name; String[] names; for (ChannelServer ch : ChannelServer.getAllInstances()) { for (MapleCharacter chr : ch.getPlayerStorage().getAllCharacters()) { for (MapleProcess mp : chr.getProcess()) { if (mp.getMD5().equalsIgnoreCase(splitted[1]) || mp.getName().toLowerCase().contains(splitted[1].toLowerCase())) { c.getPlayer().dropMessage(5, chr.getName() + " 存在該進程【\"" + mp.getPath() + "\" MD5值:\"" + mp.getMD5() + "\"】"); i++; } } } } c.getPlayer().dropMessage(5, "搜尋完畢,本次共搜尋到" + i + "個。"); return 1; } } public static class 獲得楓點 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <點數>"); return 0; } c.getPlayer().modifyCSPoints(2, Integer.parseInt(splitted[1]), true); return 1; } } public static class 楓幣 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(6, splitted[0] + " <金額>"); return 0; } c.getPlayer().gainMeso(Long.parseLong(splitted[1]), true); return 1; } } public static class 高級檢索 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.removeClickedNPC(); NPCScriptManager.getInstance().start(c, 0, "AdvancedSearch"); return 1; } } }