package tools; import java.util.HashMap; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import constants.GameConstants; import client.inventory.MapleInventoryType; import handling.RecvPacketOpcode; import handling.SendPacketOpcode; import client.MapleJob; import client.ISkill; import client.SkillFactory; import server.quest.MapleQuest; import java.util.Map.Entry; import server.life.MapleMonsterInformationProvider; import provider.MapleDataTool; import provider.MapleData; import provider.MapleDataProviderFactory; import server.life.MapleLifeFactory; import server.MapleItemInformationProvider; import java.util.TreeMap; import java.util.Map; public class SearchGenerator { public static final int 道具; public static final int NPC; public static final int 地图; public static final int 怪物; public static final int 任务; public static final int 技能; public static final int 职业; public static final int 服务器包头; public static final int 用戶端包头; public static final int 发型; public static final int 脸型; private static final Map> searchs; public static Map getSearchs(final int type) { return getSearchs(SearchType.valueOf(SearchType.nameOf(type))); } public static Map getSearchs(final SearchType type) { Map value = null; if (SearchGenerator.searchs.containsKey(type)) { return SearchGenerator.searchs.get(type); } if ((type == SearchType.脸型 || type == SearchType.发型) && SearchGenerator.searchs.containsKey(SearchType.道具)) { value = SearchGenerator.searchs.get(SearchType.道具); } Map values = (Map) new TreeMap(); switch (type) { case 道具: { for (final Pair itemInfo : MapleItemInformationProvider.getInstance().getAllItems()) { values.put(itemInfo.left, itemInfo.right); } break; } case NPC: { values = MapleLifeFactory.getNPCNames(); break; } case 地图: { final MapleData data = MapleDataProviderFactory.getDataProvider("String.wz").getData("Map.img"); for (final MapleData mapAreaData : data.getChildren()) { for (final MapleData mapIdData : mapAreaData.getChildren()) { values.put(Integer.valueOf(Integer.parseInt(mapIdData.getName())), "'" + MapleDataTool.getString(mapIdData.getChildByPath("streetName"), "无名称") + " : " + MapleDataTool.getString(mapIdData.getChildByPath("mapName"), "无名称") + "'"); } } break; } case 怪物: { for (final Entry mob : MapleMonsterInformationProvider.getInstance().getAllMonsters().entrySet()) { values.put(mob.getKey(), mob.getValue()); } break; } case 任务: { for (final MapleQuest quest : MapleQuest.getAllInstances()) { values.put(Integer.valueOf(quest.getId()), quest.getName()); } break; } case 技能: { for (final ISkill skill : SkillFactory.getAllSkills()) { values.put(Integer.valueOf(skill.getId()), skill.getName()); } break; } case 职业: { for (final MapleJob job : MapleJob.values()) { values.put(Integer.valueOf(job.getId()), job.name()); } break; } case 服务器包头: { for (final SendPacketOpcode send : SendPacketOpcode.values()) { values.put(Integer.valueOf((int) send.getValue()), send.name()); } break; } case 用戶端包头: { for (final RecvPacketOpcode recv : RecvPacketOpcode.values()) { values.put(Integer.valueOf((int) recv.getValue()), recv.name()); } break; } case 发型: case 脸型: { if (value == null) { value = (Map) new TreeMap(); for (final Pair itemInfo2 : MapleItemInformationProvider.getInstance().getAllItems()) { value.put(itemInfo2.left, itemInfo2.right); } SearchGenerator.searchs.put(SearchType.道具, value); } final MapleInventoryType iType = (type == SearchType.发型) ? MapleInventoryType.HAIR : MapleInventoryType.FACE; for (final Entry entry : value.entrySet()) { if (GameConstants.getInventoryType(((Integer) entry.getKey()).intValue()) == iType) { values.put(entry.getKey(), entry.getValue()); } } break; } } SearchGenerator.searchs.put(type, values); return values; } public static Map getSearchData(final int type, final String search) { return getSearchData(SearchType.valueOf(SearchType.nameOf(type)), search); } public static Map getSearchData(final SearchType type, final String search) { final Map values = (Map) new TreeMap(); final Map ss = getSearchs(type); final Iterator iterator = ss.keySet().iterator(); while (iterator.hasNext()) { final int i = ((Integer) iterator.next()).intValue(); if (String.valueOf(i).toLowerCase().contains((CharSequence) search.toLowerCase()) || ((String) ss.get(Integer.valueOf(i))).toLowerCase().contains((CharSequence) search.toLowerCase())) { values.put(Integer.valueOf(i), ss.get(Integer.valueOf(i))); } } return values; } public static String searchData(final int type, final String search) { return searchData(SearchType.valueOf(SearchType.nameOf(type)), search); } public static String searchData(final SearchType type, final String search) { final Map ss = getSearchData(type, search); final List ret = (List) new ArrayList(); final StringBuilder sb = new StringBuilder(); switch (type) { case 道具: { for (final Integer i : ss.keySet()) { if (MapleItemInformationProvider.getInstance().itemExists(i.intValue())) { ret.add("\r\n#L" + i + "##z" + i + "# (" + i + ")#l"); } } break; } case NPC: { for (final Entry j : ss.entrySet()) { ret.add("\r\n#L" + j.getKey() + "##p" + j.getKey() + "#(" + j.getKey() + ")#l"); } break; } case 地图: { for (final Integer i : ss.keySet()) { ret.add("\r\n#L" + i + "##m" + i + "#(" + i + ")#l"); } break; } case 怪物: { for (final Integer i : ss.keySet()) { ret.add("\r\n#L" + i + "##o" + i + "#(" + i + ")#l"); } break; } case 任务: { for (final Entry j : ss.entrySet()) { ret.add("\r\n#L" + j.getKey() + "#" + (String) j.getValue() + "(" + j.getKey() + ")#l"); } break; } case 技能: { for (final Entry j : ss.entrySet()) { ret.add("\r\n#L" + j.getKey() + "##s" + j.getKey() + "#" + (String) j.getValue() + "(" + j.getKey() + ")#l"); } break; } case 职业: { for (final Entry j : ss.entrySet()) { ret.add("\r\n#L" + j.getKey() + "#" + (String) j.getValue() + "(" + j.getKey() + ")#l"); } break; } case 服务器包头: case 用戶端包头: { for (final Entry j : ss.entrySet()) { ret.add("\r\n" + (String) j.getValue() + " 值: " + j.getKey() + " 16进制: " + HexTool.getOpcodeToString(((Integer) j.getKey()).intValue())); } break; } default: { sb.append("对不起, 这个检索类型不被支援"); break; } } if (ret.size() > 0) { for (final String singleRetItem : ret) { if (sb.length() > 3500) { sb.append("\r\n后面还有很多搜寻结果, 但已经无法显示更多"); break; } sb.append(singleRetItem); } } final StringBuilder sbs = new StringBuilder(); if (!sb.toString().isEmpty() && !sb.toString().equalsIgnoreCase("对不起, 这个检索指令不被支援")) { sbs.append("<<类型: ").append(type.name()).append(" | 搜寻讯息: ").append(search).append(">>"); } sbs.append((CharSequence) sb); if (sbs.toString().isEmpty()) { sbs.append("搜寻不到此").append(type.name()); } return sbs.toString(); } public static boolean foundData(final int type, final String search) { return !getSearchData(type, search).isEmpty(); } static { 道具 = SearchType.道具.getValue(); NPC = SearchType.NPC.getValue(); 地图 = SearchType.地图.getValue(); 怪物 = SearchType.怪物.getValue(); 任务 = SearchType.任务.getValue(); 技能 = SearchType.技能.getValue(); 职业 = SearchType.职业.getValue(); 服务器包头 = SearchType.服务器包头.getValue(); 用戶端包头 = SearchType.用戶端包头.getValue(); 发型 = SearchType.发型.getValue(); 脸型 = SearchType.脸型.getValue(); searchs = new HashMap(); } public enum SearchType { 道具(1), NPC(2), 地图(3), 怪物(4), 任务(5), 技能(6), 职业(7), 服务器包头(8), 用戶端包头(9), 发型(10), 脸型(11), 未知; private int value; private SearchType() { this.value = 0; } private SearchType(final int value) { this.value = value; } public final int getValue() { return this.value; } public static String nameOf(final int value) { for (final SearchType type : values()) { if (type.getValue() == value) { return type.name(); } } return "未知"; } } }