package client.messages.commands; import client.MapleCharacter; import client.MapleClient; import client.SkillFactory; import client.inventory.Item; import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.messages.PlayerGMRank; import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement; import custom.LoadPacket; import database.DatabaseConnection; import handling.channel.ChannelServer; import handling.login.LoginServer; import handling.world.WorldBroadcastService; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledFuture; import scripting.npc.NPCScriptManager; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MaplePortal; import server.ShutdownServer; import server.Timer.EventTimer; import tools.FileoutputUtil; import tools.HexTool; import tools.MaplePacketCreator; import tools.StringUtil; public class AdminCommand { public static PlayerGMRank getPlayerLevelRequired() { return PlayerGMRank.ADMIN; } public static class DamageBuff extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { SkillFactory.getSkill(9101003).getEffect(1).applyTo(c.getPlayer()); return 1; } } public static class 文件封包 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getSession().write(LoadPacket.getPacket()); return 1; } } public static class 最近的传送点 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MaplePortal portal = c.getPlayer().getMap().findClosestPortal(c.getPlayer().getTruePosition()); c.getPlayer().dropMessage(6, portal.getName() + " id: " + portal.getId() + " script: " + portal.getScriptName()); return 1; } } public static class Uptime extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dropMessage(6, "Server has been up for " + StringUtil.getReadableMillis(ChannelServer.serverStartTime, System.currentTimeMillis())); return 1; } } public static class DropMessage extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { String type = splitted[1]; String text = splitted[2]; if (type == null) { c.getPlayer().dropMessage(6, "Syntax error: !dropmessage type text"); return 0; } if (type.length() > 1) { c.getPlayer().dropMessage(6, "Type must be just with one word"); return 0; } if (text == null || text.length() < 1) { c.getPlayer().dropMessage(6, "Text must be 1 letter or more!!"); return 0; } c.getPlayer().dropMessage(Integer.parseInt(type), text); return 1; } } public static class DropMsg extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { String type = splitted[1]; String text = splitted[2]; if (type == null) { c.getPlayer().dropMessage(6, "Syntax error: !dropmessage type text"); return 0; } if (type.length() > 1) { c.getPlayer().dropMessage(6, "Type must be just with one word"); return 0; } if (text == null || text.length() < 1) { c.getPlayer().dropMessage(6, "Text must be 1 letter or more!!"); return 0; } //c.getPlayer().dropMsg(Integer.parseInt(type), text); return 1; } } public static class 设置管理员 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 3) { c.getPlayer().dropMessage(0, splitted[0] + " <玩家名字> <管理员等级>"); return 0; } c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]).setGmLevel(Byte.parseByte(splitted[2])); return 1; } } public static class 切换自动注册状态 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { LoginServer.autoReg = !LoginServer.autoReg; c.getPlayer().dropMessage(0, "自动注册状态: " + (LoginServer.isAutoReg() ? "开启" : "关闭")); FileoutputUtil.log("自动注册状态: " + (LoginServer.isAutoReg() ? "开启" : "关闭")); return 1; } } public static class 封包 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(0, splitted[0] + " <封包内容>"); return 0; } c.getSession().write(HexTool.getByteArrayFromHexString(StringUtil.joinStringFrom(splitted, 1))); return 1; } } public static class 脱掉所有人 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { ChannelServer cs = c.getChannelServer(); for (MapleCharacter mchr : cs.getPlayerStorage().getAllCharacters()) { if (c.getPlayer().isGM()) { continue; } MapleInventory equipped = mchr.getInventory(MapleInventoryType.EQUIPPED); MapleInventory equip = mchr.getInventory(MapleInventoryType.EQUIP); List<Short> ids = new ArrayList<>(); for (Item item : equipped.newList()) { ids.add((short)item.getPosition()); } for (short id : ids) { MapleInventoryManipulator.unequip(mchr.getClient(), id, equip.getNextFreeSlot()); } } return 1; } } public static class 送给所有人金币 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(0, splitted[0] + " <金额>"); return 0; } for (ChannelServer cserv : ChannelServer.getAllInstances()) { for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) { mch.gainMeso(Long.parseLong(splitted[1]), true); } } return 1; } } public static class HotTime extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (ChannelServer cserv : ChannelServer.getAllInstances()) { for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) { if (mch.getClient().canClickNPC() && !mch.isIntern()) { NPCScriptManager.getInstance().start(mch.getClient(), 9010010,"HOTTIME"); } } } FileoutputUtil.log("HotTime操作已经完成"); return 1; } } public static class 传送所有人到这里 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharacters()) { if (mch.getMapId() != c.getPlayer().getMapId()) { mch.changeMap(c.getPlayer().getMap(), c.getPlayer().getPosition()); } } return 1; } } public static class 踢所有人 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int range = -1; if (splitted.length < 2) { c.getPlayer().dropMessage(0, splitted[0] + " <对象: 默认c(m - 当前地图/c - 当前频道/w - 当前服务器)>"); } else { switch (splitted[1]) { case "m": range = 0; break; case "c": range = 1; break; case "w": range = 2; break; } } if (range == -1) { range = 1; } if (range == 0) { c.getPlayer().getMap().disconnectAll(); } else if (range == 1) { c.getChannelServer().getPlayerStorage().disconnectAll(true); } else if (range == 2) { for (ChannelServer cserv : ChannelServer.getAllInstances()) { cserv.getPlayerStorage().disconnectAll(true); } } return 1; } } public static class 关闭服务器 extends CommandExecute { protected static Thread t = null; @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dropMessage(6, "正在关闭服务器..."); if (t == null || !t.isAlive()) { t = new Thread(ShutdownServer.getInstance()); ShutdownServer.getInstance().shutdown(); t.start(); } else { c.getPlayer().dropMessage(6, "关闭进程正在进行或者关闭已完成, 请稍候"); } return 1; } } public static class 定时关闭服务器 extends 关闭服务器 { private static ScheduledFuture<?> ts = null; private int minutesLeft = 0; @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length < 2) { c.getPlayer().dropMessage(0, splitted[0] + " <时间:分钟>"); return 0; } minutesLeft = Integer.parseInt(splitted[1]); c.getPlayer().dropMessage(6, "服务器将在" + minutesLeft + "分钟后关闭"); if (ts == null && (t == null || !t.isAlive())) { t = new Thread(ShutdownServer.getInstance()); ts = EventTimer.getInstance().register(new Runnable() { @Override public void run() { if (minutesLeft == 0) { ShutdownServer.getInstance().shutdown(); t.start(); ts.cancel(false); return; } WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.serverMessageNotice("服务器将在" + minutesLeft + "分钟后进行停机维护, 请及时安全下线, 以免造成不必要的损失")); minutesLeft--; } }, 60000); } 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(0, splitted[0] + " <SQL命令>"); return 0; } try { Connection con = (Connection) DatabaseConnection.getConnection(); PreparedStatement ps = (PreparedStatement) con.prepareStatement(StringUtil.joinStringFrom(splitted, 1)); ps.executeUpdate(); ps.close(); } catch (SQLException e) { c.getPlayer().dropMessage(0, "执行SQL命令失败"); return 0; } return 1; } } public static class 检测复制 extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); Iterator i$; MapleCharacter player; List<String> msgs = new ArrayList(); Map checkItems = new LinkedHashMap(); for (ChannelServer cserv : ChannelServer.getAllInstances()) { for (i$ = cserv.getPlayerStorage().getAllCharacters().iterator(); i$.hasNext();) { player = (MapleCharacter) i$.next(); if ((player != null) && (player.getMap() != null)) { MapleInventory equip = player.getInventory(MapleInventoryType.EQUIP); for (Item item : equip.list()) { if (item.getEquipOnlyId() > 0) { CopyItemInfo ret = new CopyItemInfo(item.getItemId(), player.getId(), player.getName()); if (checkItems.containsKey(item.getEquipOnlyId())) { ret = (CopyItemInfo) checkItems.get(item.getEquipOnlyId()); if (ret.itemId == item.getItemId()) { if (ret.isFirst()) { ret.setFirst(false); msgs.add("角色: " + StringUtil.getRightPaddedStr(ret.name, ' ', 13) + " 角色ID: " + StringUtil.getRightPaddedStr(String.valueOf(ret.chrId), ' ', 6) + " 道具: " + ret.itemId + " - " + ii.getName(ret.itemId) + " 唯一ID: " + item.getEquipOnlyId()); } else { msgs.add("角色: " + StringUtil.getRightPaddedStr(player.getName(), ' ', 13) + " 角色ID: " + StringUtil.getRightPaddedStr(String.valueOf(player.getId()), ' ', 6) + " 道具: " + item.getItemId() + " - " + ii.getName(item.getItemId()) + " 唯一ID: " + item.getEquipOnlyId()); } } } else { checkItems.put(item.getEquipOnlyId(), ret); } } } equip = player.getInventory(MapleInventoryType.EQUIPPED); for (Item item : equip.list()) { if (item.getEquipOnlyId() > 0) { CopyItemInfo ret = new CopyItemInfo(item.getItemId(), player.getId(), player.getName()); if (checkItems.containsKey(item.getEquipOnlyId())) { ret = (CopyItemInfo) checkItems.get(item.getEquipOnlyId()); if (ret.itemId == item.getItemId()) { if (ret.isFirst()) { ret.setFirst(false); msgs.add("角色: " + StringUtil.getRightPaddedStr(ret.name, ' ', 13) + " 角色ID: " + StringUtil.getRightPaddedStr(String.valueOf(ret.chrId), ' ', 6) + " 道具: " + ret.itemId + " - " + ii.getName(ret.itemId) + " 唯一ID: " + item.getEquipOnlyId()); } else { msgs.add("角色: " + StringUtil.getRightPaddedStr(player.getName(), ' ', 13) + " 角色ID: " + StringUtil.getRightPaddedStr(String.valueOf(player.getId()), ' ', 6) + " 道具: " + item.getItemId() + " - " + ii.getName(item.getItemId()) + " 唯一ID: " + item.getEquipOnlyId()); } } } else { checkItems.put(item.getEquipOnlyId(), ret); } } } } } } checkItems.clear(); if (msgs.size() > 0) { c.getPlayer().dropMessage(5, "检测完成,共有: " + msgs.size() + " 个复制信息"); FileoutputUtil.log(FileoutputUtil.复制装备, "检测完成,共有: " + msgs.size() + " 个复制信息", true); for (String s : msgs) { c.getPlayer().dropMessage(5, s); FileoutputUtil.log(FileoutputUtil.复制装备, s, true); } c.getPlayer().dropMessage(5, "以上信息为拥有复制道具的玩家。"); } else { c.getPlayer().dropMessage(5, "未检测到游戏中的角色有复制的道具信息。"); } return 1; } } }