package client.messages.commands;
import client.MapleCharacter;
import client.MapleCharacterUtil;
import client.MapleClient;
import client.MapleJob;
import client.MapleStat;
import client.Skill;
import client.SkillFactory;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import client.messages.CommandProcessor;
import client.messages.CommandProcessorUtil;
import client.messages.PlayerGMRank;
import constants.GameConstants;
import handling.RecvPacketOpcode;
import handling.SendPacketOpcode;
import handling.channel.ChannelServer;
import handling.world.CheaterData;
import handling.world.World;
import handling.world.WorldBroadcastService;
import handling.world.WorldFindService;
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.npc.NPCScriptManager;
import server.ItemInformation;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MaplePortal;
import server.life.MapleMonster;
import server.maps.MapleMap;
import server.maps.MapleMapItem;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.quest.MapleQuest;
import server.shop.MapleShopFactory;
import server.squad.MapleSquadType;
import tools.HexTool;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.StringUtil;
import tools.packet.InventoryPacket;
import tools.packet.NPCPacket;
/**
*
* @author Emilyx3
*/
public class InternCommand {
public static PlayerGMRank getPlayerLevelRequired() {
return PlayerGMRank.INTERN;
}
public static class 隐身 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
Skill skill = SkillFactory.getSkill(9001004);
Skill skill2 = SkillFactory.getSkill(1010);
if (c.getPlayer().isHidden()) {
c.getPlayer().cancelEffect(skill.getEffect(1), false, -1L);
c.getPlayer().cancelEffect(skill2.getEffect(1), false, -1L);
c.getPlayer().dropMessage(6, "隐身模式已关闭。");
} else {
skill.getEffect(1).applyTo(c.getPlayer());
skill2.getEffect(1).applyTo(c.getPlayer());
c.getPlayer().dropMessage(6, "隐身模式已开启。");
}
return 0;
}
}
public static class 治愈 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getStat().heal(c.getPlayer());
c.getPlayer().dispelDebuffs();
return 0;
}
}
public static class 地图治愈 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().heal(mch);
mch.dispelDebuffs();
}
}
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[splitted.length - 1]);
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel()) {
victim.getClient().getSession().close(true);
victim.getClient().disconnect(true, false);
return 1;
} else {
c.getPlayer().dropMessage(6, "受害者不存在");
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;
}
MapleCharacter player = c.getPlayer();
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, "没找到玩家 " + splitted[i]);
}
if (victim != null && player.allowedToTarget(victim) && player.getGMLevel() >= victim.getGMLevel()) {
victim.getStat().setMp((short) 0);
victim.getStat().setHp((short) 0);
victim.updateSingleStat(MapleStat.HP, victim.getStat().getHp());
victim.updateSingleStat(MapleStat.MP, victim.getStat().getMp());
}
}
return 1;
}
}
public static class 我在哪 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().dropMessage(5, "你在地图(ID:" + c.getPlayer().getMap().getId() + ")");
return 1;
}
}
public static class 线上 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 去往 extends CommandExecute {
private static final HashMap<String, Integer> gotomaps = new HashMap<>();
static {
gotomaps.put("专业技术村庄", 910001000);
gotomaps.put("阿里安特", 260000100);
gotomaps.put("彩虹岛", 1010000);
gotomaps.put("婚礼村", 680000000);
gotomaps.put("蔚蓝道路", 860000000);
gotomaps.put("水下世界", 230000000);
gotomaps.put("驳船码头", 541000000);
// gotomaps.put("cwk", 610030000);
gotomaps.put("埃德尔斯坦", 310000000);
gotomaps.put("艾琳森林", 300000000);
gotomaps.put("魔法密林", 101000000);
gotomaps.put("艾利涅胡", 101071300);
gotomaps.put("埃欧雷", 101050000);
gotomaps.put("冰峰雪域", 211000000);
gotomaps.put("圣地", 130000000);
// gotomaps.put("florina", 120000300);
gotomaps.put("自由市场", 910000000);
gotomaps.put("未来之门", 271000000);
gotomaps.put("工作场所", 180000000);
gotomaps.put("幸福村", 209000000);
gotomaps.put("明珠港", 104000000);
gotomaps.put("射手村", 100000000);
gotomaps.put("百草堂", 251000000);
gotomaps.put("甘榜村", 551000000);
gotomaps.put("废弃都市", 103000000);
// gotomaps.put("korean", 222000000);
gotomaps.put("神木村", 240000000);
gotomaps.put("玩具城", 220000000);
gotomaps.put("马来西亚", 550000000);
gotomaps.put("武陵", 250000000);
gotomaps.put("诺特勒斯", 120000000);
gotomaps.put("新野城", 600000000);
// gotomaps.put("omega", 221000000);
gotomaps.put("天空之城", 200000000);
gotomaps.put("万神殿", 400000000);
gotomaps.put("品克缤", 270050100);
gotomaps.put("神的黄昏", 270050100);
// gotomaps.put("phantom", 610010000);
gotomaps.put("勇士部落", 102000000);
gotomaps.put("里恩", 140000000);
gotomaps.put("昭和村", 801000000);
gotomaps.put("新加坡", 540000000);
gotomaps.put("六岔路口", 104020000);
gotomaps.put("林中之城", 105000000);
gotomaps.put("南港", 2000000);
gotomaps.put("大树口村", 866000000);
gotomaps.put("时间神殿", 270000000);
gotomaps.put("三个门", 270000000);
gotomaps.put("黄昏勇士部落", 273000000);
gotomaps.put("克林逊森林城堡", 301000000);
gotomaps.put("城堡顶端", 301000000);
gotomaps.put("皮亚奴斯", 230040420);
gotomaps.put("皮亚奴斯洞穴", 230040420);
gotomaps.put("黑龙", 240060200);
gotomaps.put("暗黑龙王洞穴", 240060200);
gotomaps.put("进阶黑龙", 240060201);
gotomaps.put("进阶暗黑龙王洞穴", 240060201);
gotomaps.put("天鹰", 240020101);
gotomaps.put("格瑞芬多森林", 240020101);
gotomaps.put("火焰龙", 240020401);
gotomaps.put("喷火龙栖息地", 240020401);
gotomaps.put("扎昆", 280030100);
gotomaps.put("扎昆的祭台", 280030100);
gotomaps.put("进阶扎昆", 280030000);
gotomaps.put("进阶扎昆的祭台", 280030000);
gotomaps.put("闹钟", 220080001);
gotomaps.put("帕普拉图斯", 220080001);
gotomaps.put("时间塔的本源", 220080001);
gotomaps.put("OX问答", 109020001);
gotomaps.put("上楼", 109030101);
gotomaps.put("向高地", 109040000);
gotomaps.put("雪球赛", 109060000);
gotomaps.put("江户村", 800000000);
}
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <地图名>");
} else {
if (gotomaps.containsKey(splitted[1])) {
MapleMap target = c.getChannelServer().getMapFactory().getMap(gotomaps.get(splitted[1]));
if (target == null) {
c.getPlayer().dropMessage(6, "地图不存在");
return 0;
}
MaplePortal targetPortal = target.getPortal(0);
c.getPlayer().changeMap(target, targetPortal);
} else {
if (splitted[1].equals("列表")) {
c.getPlayer().dropMessage(6, "地图列表: ");
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, "命令错误: " + splitted[0] + " <地图名> 你可以使用 " + splitted[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] + " (时间:默认60秒)");
}
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.getClock(CommandProcessorUtil.getOptionalIntArg(splitted, 1, 60)));
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]);
if (victim != null) {
if ((!c.getPlayer().isGM() && (victim.isInBlockedMap() || victim.isGM()))) {
c.getPlayer().dropMessage(5, "请稍后再试");
return 0;
}
victim.changeMap(c.getPlayer().getMap(), c.getPlayer().getMap().findClosestPortal(c.getPlayer().getTruePosition()));
} else {
int ch = WorldFindService.getInstance().findChannel(splitted[1]);
if (ch < 0) {
c.getPlayer().dropMessage(5, "未找到");
return 0;
}
victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(splitted[1]);
if (victim == null || (!c.getPlayer().isGM() && (victim.isInBlockedMap() || victim.isGM()))) {
c.getPlayer().dropMessage(5, "请稍后再试");
return 0;
}
c.getPlayer().dropMessage(5, "受害者正在改变频道");
victim.dropMessage(5, "正在改变频道");
victim.changeChannel(c.getChannel());
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()));
}
}
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]);
c.getPlayer().dropMessage(6, "用法一:(要传送的玩家名字) <地图ID> (portalID:默认无)");
c.getPlayer().dropMessage(6, "用法二:<要传送到的玩家名字>");
return 0;
}
MapleCharacter victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (victim != null && c.getPlayer().getGMLevel() >= victim.getGMLevel()) {
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, "地图不存在");
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, "portal选择无效");
} 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 = WorldFindService.getInstance().findChannel(splitted[1]);
if (ch < 0) {
MapleMap target = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[1]));
if (target == null) {
c.getPlayer().dropMessage(6, "地图不存在");
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, "portal选择无效");
} 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, "正在改变频道, 请稍候");
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, "出现错误: " + e.getMessage());
return 0;
}
}
return 1;
}
}
public static class 查找 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length == 1) {
c.getPlayer().dropMessage(6, splitted[0] + ": <类型> <搜索信息>");
c.getPlayer().dropMessage(6, "类型:NPC/怪物/物品/地图/技能/任务/包头");
} else if (splitted.length == 2) {
c.getPlayer().dropMessage(6, "请提供搜索信息");
} else {
String type = splitted[1];
String search = StringUtil.joinStringFrom(splitted, 2);
MapleData data;
MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "/String.wz"));
StringBuilder sb = new StringBuilder();
sb.append("<<" + "类型: ").append(type).append(" | " + "搜索信息: ").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"), "无名字")));
}
for (Pair<Integer, String> npcPair : npcPairList) {
if (npcPair.getRight().toLowerCase().contains(search.toLowerCase())) {
retNpcs.add("\r\n" + npcPair.getLeft() + " - " + npcPair.getRight());
}
}
if (retNpcs.size() > 0) {
for (String singleRetNpc : retNpcs) {
if (sb.length() > 10000) {
sb.append("\r\n后面还有很多搜索结果, 但已经无法显示更多");
break;
}
sb.append(singleRetNpc);
//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, "该NPC信息搜索不到");
}
} else if (type.equalsIgnoreCase("地图")) {
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.size() > 0) {
for (String singleRetMap : retMaps) {
if (sb.length() > 10000) {
sb.append("\r\n后面还有很多搜索结果, 但已经无法显示更多");
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, "该地图信息搜索不到");
}
} else if (type.equalsIgnoreCase("怪物")) {
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.size() > 0) {
for (String singleRetMob : retMobs) {
if (sb.length() > 10000) {
sb.append("\r\n后面还有很多搜索结果, 但已经无法显示更多");
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, "该怪物信息搜索不到");
}
} else if (type.equalsIgnoreCase("物品")) {
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 + " - #i" + itemPair.itemId + ":# " + "#z" + itemPair.itemId + "#");
}
}
if (retItems.size() > 0) {
for (String singleRetItem : retItems) {
if (sb.length() > 10000) {
sb.append("\r\n后面还有很多搜索结果, 但已经无法显示更多");
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, "该物品信息搜索不到");
}
} else if (type.equalsIgnoreCase("技能")) {
List<String> retSkills = new ArrayList<>();
for (Skill skill : SkillFactory.getAllSkills()) {
if (skill.getName() != null && skill.getName().toLowerCase().contains(search.toLowerCase())) {
retSkills.add("\r\n#s" + skill.getId() + "#" + skill.getId() + " - " + skill.getName());
}
}
if (retSkills.size() > 0) {
for (String singleRetSkill : retSkills) {
if (sb.length() > 10000) {
sb.append("\r\n后面还有很多搜索结果, 但已经无法显示更多");
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, "该技能信息搜索不到");
}
} else if (type.equalsIgnoreCase("包头")) {
List<String> headers = new ArrayList<>();
headers.add("\r\n服务端包头:");
for (SendPacketOpcode send : SendPacketOpcode.values()) {
if (send.name() != null && send.name().toLowerCase().contains(search.toLowerCase())) {
headers.add("\r\n" + send.name() + " 值: " + send.getValue(false) + " 16进制: " + HexTool.getOpcodeToString(send.getValue(false)));
}
}
headers.add("\r\n客户端包头:");
for (RecvPacketOpcode recv : RecvPacketOpcode.values()) {
if (recv.name() != null && recv.name().toLowerCase().contains(search.toLowerCase())) {
headers.add("\r\n" + recv.name() + " 值: " + recv.getValue() + " 16进制: " + HexTool.getOpcodeToString(recv.getValue()));
}
}
for (String header : headers) {
if (sb.length() > 10000) {
sb.append("\r\n后面还有很多搜索结果, 但已经无法显示更多");
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, "对不起, 不支持这个检索命令");
}
c.getSession().write(NPCPacket.sendNPCSay(9010000, sb.toString()));
}
return 0;
}
}
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 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 清怪 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " (范围:默认全图) (地图ID:默认当前地图)");
}
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, "地图不存在");
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 清怪爆物 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " (<范围:默认0全图> (地图:默认当前地图))");
}
MapleMap map = c.getPlayer().getMap();
double range = Double.POSITIVE_INFINITY;
if (splitted.length > 1) {
int irange = Integer.parseInt(splitted[1]);
if (irange != 0) {
range = irange * irange;
}
if (splitted.length > 2) {
map = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[2]));
}
}
if (map == null) {
c.getPlayer().dropMessage(6, "地图不存在");
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 全屏捡物 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(InventoryPacket.removeItemFromMap(mapitem.getObjectId(), 2, c.getPlayer().getId()), mapitem.getPosition());
c.getPlayer().getMap().removeMapObject(item);
}
return 1;
}
}
public static class 清除BUFF extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().cancelAllBuffs();
return 1;
}
}
public static class 换频道 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().changeChannel(Integer.parseInt(splitted[1]));
return 1;
}
}
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 FakeRelog extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().fakeRelog();
return 1;
}
}
public static class 打开NPC extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
if (splitted.length < 2) {
c.getPlayer().dropMessage(6, splitted[0] + " <NPCID> (模式:默认空)");
return 0;
}
NPCScriptManager.getInstance().start(c, Integer.parseInt(splitted[1]), splitted.length > 2 ? StringUtil.joinStringFrom(splitted, 2) : splitted[1]);
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.getInstance().getShop(Integer.parseInt(splitted[1]));
return 1;
}
}
public static class 清扫地面 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
c.getPlayer().getMap().removeDrops();
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 (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, true);
c.getPlayer().setSubcategory(c.getPlayer().getSubcategory());
return 1;
}
}
public static class 杀死附近玩家 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleMap map = c.getPlayer().getMap();
List<MapleMapObject> players = map.getMapObjectsInRange(c.getPlayer().getPosition(), 25000, Arrays.asList(MapleMapObjectType.PLAYER));
for (MapleMapObject closeplayers : players) {
MapleCharacter playernear = (MapleCharacter) closeplayers;
if (playernear.isAlive() && playernear != c.getPlayer() && playernear.getGMLevel() < c.getPlayer().getGMLevel()) {
playernear.getStat().setHp((short) 0);
playernear.getStat().setMp((short) 0);
playernear.updateSingleStat(MapleStat.HP, playernear.getStat().getHp());
playernear.updateSingleStat(MapleStat.MP, playernear.getStat().getMp());
playernear.dropMessage(5, "你太靠近管理员了");
}
}
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(MaplePacketCreator.broadcastMsg(25, 0, "MapleGM is hosting an event! Use the @joinevent command to join the event!"));
//World.Broadcast.broadcastMessage(MaplePacketCreator.broadcastMsg(26, 0, "Event Map: " + c.getPlayer().getMap().getMapName()));
chrs.getClient().getSession().write(MaplePacketCreator.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 25, c.getChannel(), "活动 : 管理员开启了一个活动, 使用 @参加活动 来加入活动吧!"));
chrs.getClient().getSession().write(MaplePacketCreator.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 26, c.getChannel(), "活动 : 活动频道: " + c.getChannel() + " 活动地图: " + c.getPlayer().getMap().getMapName()));
}
} else {
for (MapleCharacter chrs : c.getChannelServer().getPlayerStorage().getAllCharacters()) {
//World.Broadcast.broadcastMessage(MaplePacketCreator.broadcastMsg(22, 0, "Enteries to the GM event are closed. The event has began!"));
chrs.getClient().getSession().write(MaplePacketCreator.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 22, c.getChannel(), "活动 : Enteries to the GM event are closed. The event has began!"));
}
}
return 1;
}
}*/
/*public static class 开始炸弹人活动 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (player.getMapId() != 109010100) {
player.dropMessage(5, "该命令只能在地图(ID: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(MaplePacketCreator.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 22, c.getChannel(), "活动 : 炸弹人活动已经开始了!"));
}
player.getMap().broadcastMessage(CField.getClock(60));
}
return 1;
}
}
public static class 结束炸弹人活动 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (player.getMapId() != 109010100) {
player.dropMessage(5, "该命令只能在地图(ID: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(MaplePacketCreator.broadcastMsg(GameConstants.isEventMap(chrs.getMapId()) ? 0 : 22, c.getChannel(), "活动 : 炸弹人活动已经结束, 胜利者是: " + winner));
}
}
return 1;
}
}*/
public static class 清理背包 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
MapleCharacter player = c.getPlayer();
if (splitted.length < 2 || player.hasBlockedInventory()) {
c.getPlayer().dropMessage(5, splitted[0] + " <物品栏:装备 / 消耗 / 其他 / 设置 / 特殊 / 全部>");
return 0;
} else {
MapleInventoryType type;
if (splitted[1].equalsIgnoreCase("装备")) {
type = MapleInventoryType.EQUIP;
} else if (splitted[1].equalsIgnoreCase("消耗")) {
type = MapleInventoryType.USE;
} else if (splitted[1].equalsIgnoreCase("设置")) {
type = MapleInventoryType.SETUP;
} else if (splitted[1].equalsIgnoreCase("其他")) {
type = MapleInventoryType.ETC;
} else if (splitted[1].equalsIgnoreCase("特殊")) {
type = MapleInventoryType.CASH;
} else if (splitted[1].equalsIgnoreCase("全部")) {
type = null;
} else {
c.getPlayer().dropMessage(5, "找不到物品栏 <装备 / 消耗 / 其他 / 设置 / 特殊 / 全部>");
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, "该物品栏没有物品");
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, "已经清除了第" + start + "格到第" + 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, "该物品栏没有物品");
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, "已经清除了第" + start + "格到第" + end + "格的物品");
}
return 1;
}
}
}
public static class 杀死地图玩家 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.getStat().setMp((short) 0);
map.updateSingleStat(MapleStat.HP, map.getStat().getHp());
map.updateSingleStat(MapleStat.MP, map.getStat().getMp());
}
}
return 1;
}
}
/*public static class 聊天类型 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
try {
//c.getPlayer().setChatColour(c.getPlayer().getChatColor() == 0 ? (short) 11 : 0);
c.getPlayer().setChatType(c.getPlayer().getChatType() == 0 ? (short) 11 : 0);
c.getPlayer().dropMessage(0, "文字颜色已经改变");
} catch (Exception e) {
c.getPlayer().dropMessage(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] + " <关键字词>");
return 0;
}
c.getPlayer().dropMessage(6, "搜索命令(关键字词:" + splitted[1] + ")结果如下:");
HashMap<Integer, ArrayList<String>> commandList = CommandProcessor.getCommandList();
for (int i = 0; i <= c.getPlayer().getGMLevel(); i++) {
if (commandList.containsKey(i)) {
final StringBuilder sb = new StringBuilder("");
final StringBuilder 命令前缀 = new StringBuilder("");
char[] gmRank = PlayerGMRank.getByLevel(i).getCommandPrefix();
for (int j = 0; j < gmRank.length; j++) {
命令前缀.append('"').append(gmRank[j]).append('"');
if (j != gmRank.length - 1 && gmRank.length != 1) {
命令前缀.append("或");
}
}
for (String s : commandList.get(i)) {
if (s.contains(splitted[1].toLowerCase())) {
if ((gmRank.length > 1 && s.substring(0, 1).equals(String.valueOf(gmRank[0]))) || gmRank.length == 1) {
sb.append(s.substring(1));
sb.append(",");
}
}
}
if (!sb.toString().equals("")) {
c.getPlayer().dropMessage(6, "-----------------------------------------------------------------------------------------");
if (i == 0) {
c.getPlayer().dropMessage(6, "玩家命令(前缀:" + 命令前缀 + "):");
} else if (i == 1) {
c.getPlayer().dropMessage(6, "捐赠者命令(前缀:" + 命令前缀 + "):");
} else if (i == 2) {
c.getPlayer().dropMessage(6, "高级捐赠者命令(前缀:" + 命令前缀 + "):");
} else if (i == 3) {
c.getPlayer().dropMessage(6, "实习管理员命令(前缀:" + 命令前缀 + "):");
} else if (i == 4) {
c.getPlayer().dropMessage(6, "游戏管理员命令(前缀:" + 命令前缀 + "):");
} else if (i == 5) {
c.getPlayer().dropMessage(6, "高级理员命令(前缀:" + 命令前缀 + "):");
} else if (i == 6) {
c.getPlayer().dropMessage(6, "服务器管理员命令(前缀:" + 命令前缀 + "):");
}
c.getPlayer().dropMessage(6, sb.toString());
}
}
}
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;
}
String msg = MapleClient.getAccInfoByName(splitted[1], c.getPlayer().isAdmin());
if (msg != null) {
c.getPlayer().dropMessage(6, msg);
} else {
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] + " <玩家账号>");
return 0;
}
String msg = MapleClient.getAccInfo(splitted[1], c.getPlayer().isAdmin());
if (msg != null) {
c.getPlayer().dropMessage(6, msg);
} else {
c.getPlayer().dropMessage(6, "输入的账号错误,无法找到信息。");
}
return 1;
}
}
public static class 检测作弊 extends CommandExecute {
@Override
public int execute(MapleClient c, String[] splitted) {
List cheaters = World.getCheaters();
if (cheaters.isEmpty()) {
c.getPlayer().dropMessage(6, "未检测到作弊。");
return 1;
}
for (int x = cheaters.size() - 1; x >= 0; x--) {
CheaterData cheater = (CheaterData) cheaters.get(x);
c.getPlayer().dropMessage(6, cheater.getInfo());
}
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;
}
StringBuilder builder = new StringBuilder();
MapleCharacter other = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]);
if (other == null) {
builder.append("输入的角色不存在...");
c.getPlayer().dropMessage(6, builder.toString());
return 0;
}
if (other.getClient().getLastPing() <= 0L) {
other.getClient().sendPing();
}
builder.append(MapleClient.getLogMessage(other, ""));
builder.append(" 坐标 ").append(other.getPosition().x);
builder.append(" /").append(other.getPosition().y);
builder.append(" || 血 : ");
builder.append(other.getStat().getHp());
builder.append(" /");
builder.append(other.getStat().getCurrentMaxHp());
builder.append(" || 蓝 : ");
builder.append(other.getStat().getMp());
builder.append(" /");
builder.append(other.getStat().getCurrentMaxMp());
builder.append(" || 物理攻击力 : ");
builder.append(other.getStat().getTotalWatk());
builder.append(" || 魔法攻击力 : ");
builder.append(other.getStat().getTotalMagic());
builder.append(" || 最大攻击 : ");
builder.append(other.getStat().getCurrentMaxBaseDamage());
builder.append(" || 伤害% : ");
builder.append(other.getStat().getDamageRate());
builder.append(" || BOSS伤害% : ");
builder.append(other.getStat().getBossDamageRate());
builder.append(" || 爆击几率 : ");
builder.append(other.getStat().passive_sharpeye_rate());
builder.append(" || 暴击伤害 : ");
builder.append(other.getStat().passive_sharpeye_percent());
builder.append(" || 力量 : ");
builder.append(other.getStat().getStr());
builder.append(" || 敏捷 : ");
builder.append(other.getStat().getDex());
builder.append(" || 智力 : ");
builder.append(other.getStat().getInt());
builder.append(" || 运气 : ");
builder.append(other.getStat().getLuk());
builder.append(" || 全部力量 : ");
builder.append(other.getStat().getTotalStr());
builder.append(" || 全部敏捷 : ");
builder.append(other.getStat().getTotalDex());
builder.append(" || 全部智力 : ");
builder.append(other.getStat().getTotalInt());
builder.append(" || 全部运气 : ");
builder.append(other.getStat().getTotalLuk());
builder.append(" || 经验 : ");
builder.append(other.getExp());
builder.append(" || 金币 : ");
builder.append(other.getMeso());
builder.append(" || 是否组队 : ");
builder.append(other.getParty() == null ? -1 : other.getParty().getId());
builder.append(" || 是否交易: ");
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(" || 连接地址: ");
other.getClient().DebugMessage(builder);
c.getPlayer().dropMessage(6, builder.toString());
return 1;
}
}
}