/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tools;
import client.MapleJob;
import client.Skill;
import client.SkillFactory;
import handling.RecvPacketOpcode;
import handling.SendPacketOpcode;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import provider.MapleData;
import provider.MapleDataProviderFactory;
import provider.MapleDataTool;
import server.ItemInformation;
import server.MapleItemInformationProvider;
import server.life.MapleLifeFactory;
import server.life.MapleMonsterInformationProvider;
import server.quest.MapleQuest;
/**
*
* @author Pungin
*/
public class SearchGenerator {
public enum SearchType {
道具(1),
NPC(2),
地圖(3),
怪物(4),
任務(5),
技能(6),
職業(7),
包頭(8),
未知;
private int value;
SearchType() {
this.value = 0;
}
SearchType(int value) {
this.value = value;
}
public final int getValue() {
return value;
}
public static String nameOf(int value) {
for (SearchType type : SearchType.values()) {
if (type.getValue() == value) {
return type.name();
}
}
return "未知";
}
}
public static final int 道具 = SearchType.道具.getValue();
public static final int NPC = SearchType.NPC.getValue();
public static final int 地圖 = SearchType.地圖.getValue();
public static final int 怪物 = SearchType.怪物.getValue();
public static final int 任務 = SearchType.任務.getValue();
public static final int 技能 = SearchType.技能.getValue();
public static final int 職業 = SearchType.職業.getValue();
public static final int 包頭 = SearchType.包頭.getValue();
private static final Map<SearchType, Map<Integer, String>> searchs = new HashMap();
public static Map<Integer, String> getSearchs(int type) {
return getSearchs(SearchType.valueOf(SearchType.nameOf(type)));
}
public static Map<Integer, String> getSearchs(SearchType type) {
if (searchs.containsKey(type)) {
return searchs.get(type);
}
// Map<Integer, String> values = new TreeMap<>((v1, v2) -> v1.compareTo(v2));
Map<Integer, String> values = new TreeMap();
switch (type) {
case 道具:
for (ItemInformation itemInfo : MapleItemInformationProvider.getInstance().getAllItems()) {
values.put(itemInfo.itemId, itemInfo.name);
}
break;
case NPC:
values = MapleLifeFactory.getNPCNames();
break;
case 地圖:
MapleData data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath", "wz") + "//" + "String.wz")).getData("Map.img");
for (MapleData mapAreaData : data.getChildren()) {
for (MapleData mapIdData : mapAreaData.getChildren()) {
values.put(Integer.parseInt(mapIdData.getName()), "'" + MapleDataTool.getString(mapIdData.getChildByPath("streetName"), "無名稱") + " : " + MapleDataTool.getString(mapIdData.getChildByPath("mapName"), "無名稱") + "'");
}
}
break;
case 怪物:
for (Map.Entry<Integer, String> mob : MapleMonsterInformationProvider.getInstance().getAllMonsters().entrySet()) {
values.put(mob.getKey(), mob.getValue());
}
break;
case 任務:
for (MapleQuest quest : MapleQuest.getAllInstances()) {
values.put(quest.getId(), quest.getName());
}
break;
case 技能: {
for (Skill skill : SkillFactory.getAllSkills()) {
values.put(skill.getId(), skill.getName());
}
break;
}
case 職業:
for (MapleJob job : MapleJob.values()) {
values.put(job.getId(), job.name());
}
break;
case 包頭:
break;
}
searchs.put(type, values);
return values;
}
public static Map<Integer, String> getSearchData(int type, String search) {
return getSearchData(SearchType.valueOf(SearchType.nameOf(type)), search);
}
public static Map<Integer, String> getSearchData(SearchType type, String search) {
// Map<Integer, String> values = new TreeMap<>((v1, v2) -> v1.compareTo(v2));
Map<Integer, String> values = new TreeMap();
Map<Integer, String> ss = getSearchs(type);
for (int i : ss.keySet()) {
if (String.valueOf(i).toLowerCase().contains(search.toLowerCase()) || ss.get(i).toLowerCase().contains(search.toLowerCase())) {
values.put(i, ss.get(i));
}
}
return values;
}
public static String searchData(int type, String search) {
return searchData(SearchType.valueOf(SearchType.nameOf(type)), search);
}
public static String searchData(SearchType type, String search) {
Map<Integer, String> ss = getSearchData(type, search);
List<String> ret = new ArrayList<>();
StringBuilder sb = new StringBuilder();
switch (type) {
case 道具:
for (Integer i :ss.keySet()) {
ret.add("\r\n#L" + i + "##i" + i + ":# #z" + i + "#(" + i + ")#l");
}
// ss.keySet().forEach((i) -> ret.add("\r\n#L" + i + "##i" + i + ":# #z" + i + "#(" + i + ")#l"));
break;
case NPC:
for(Map.Entry<Integer, String> i : ss.entrySet()) {
ret.add("\r\n#L" + i.getKey() + "##p" + i.getKey() + "##" + i.getValue() + "(" + i.getKey() + ")#l");
}
// ss.entrySet().forEach((i) -> ret.add("\r\n#L" + i.getKey() + "##p" + i.getKey() + "##" + i.getValue() + "(" + i.getKey() + ")#l"));
break;
case 地圖:
for (Integer i : ss.keySet()) {
ret.add("\r\n#L" + i + "##m" + i + "#(" + i + ")#l");
}
// ss.keySet().forEach((i) -> ret.add("\r\n#L" + i + "##m" + i + "#(" + i + ")#l"));
break;
case 怪物:
for (Integer i : ss.keySet()) {
ret.add("\r\n#L" + i + "##o" + i + "#(" + i + ")#l");
}
// ss.keySet().forEach((i) -> ret.add("\r\n#L" + i + "##o" + i + "#(" + i + ")#l"));
break;
case 任務:
for(Map.Entry<Integer, String> i : ss.entrySet()) {
ret.add("\r\n#L" + i.getKey() + "#" + i.getValue() + "(" + i.getKey() + ")#l");
}
// ss.entrySet().forEach((i) -> ret.add("\r\n#L" + i.getKey() + "#" + i.getValue() + "(" + i.getKey() + ")#l"));
break;
case 技能:
for(Map.Entry<Integer, String> i : ss.entrySet()) {
ret.add("\r\n#L" + i.getKey() + "##s" + i.getKey() + "#" + i.getValue() + "(" + i.getKey() + ")#l");
}
// ss.entrySet().forEach((i) -> ret.add("\r\n#L" + i.getKey() + "##s" + i.getKey() + "#" + i.getValue() + "(" + i.getKey() + ")#l"));
break;
case 職業:
for(Map.Entry<Integer, String> i : ss.entrySet()) {
ret.add("\r\n#L" + i.getKey() + "#" + i.getValue() + "(" + i.getKey() + ")#l");
}
// ss.entrySet().forEach((i) -> ret.add("\r\n#L" + i.getKey() + "#" + i.getValue() + "(" + i.getKey() + ")#l"));
break;
case 包頭:
ret.add("\r\n伺服端包頭:");
for (SendPacketOpcode send : SendPacketOpcode.values()) {
if (send.name() != null && send.name().toLowerCase().contains(search.toLowerCase())) {
ret.add("\r\n" + send.name() + " 值: " + send.getValue() + " 16進制: " + HexTool.getOpcodeToString(send.getValue()));
}
}
ret.add("\r\n用戶端包頭:");
for (RecvPacketOpcode recv : RecvPacketOpcode.values()) {
if (recv.name() != null && recv.name().toLowerCase().contains(search.toLowerCase())) {
ret.add("\r\n" + recv.name() + " 值: " + recv.getValue() + " 16進制: " + HexTool.getOpcodeToString(recv.getValue()));
}
}
break;
default:
sb.append("對不起, 這個檢索類型不被支援");
}
if (ret.size() > 0) {
for (String singleRetItem : ret) {
if (sb.length() > 3500) {
sb.append("\r\n後面還有很多搜尋結果, 但已經無法顯示更多");
break;
}
sb.append(singleRetItem);
}
}
StringBuilder sbs = new StringBuilder();
if (!sb.toString().isEmpty() && !sb.toString().equalsIgnoreCase("對不起, 這個檢索指令不被支援")) {
sbs.append("<<類型: ").append(type.name()).append(" | 搜尋訊息: ").append(search).append(">>");
}
sbs.append(sb);
if (sbs.toString().isEmpty()) {
sbs.append("搜尋不到此").append(type.name());
}
return sbs.toString();
}
public static boolean foundData(int type, String search) {
String str = searchData(type, search);
return !str.startsWith("搜尋不到此") && !str.equalsIgnoreCase("對不起, 這個檢索指令不被支援");
}
}