package javastory.login; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import javastory.game.Equip; import javastory.game.Item; import javastory.wz.WzData; import javastory.wz.WzDataDirectoryEntry; import javastory.wz.WzDataFileEntry; import javastory.wz.WzDataProvider; import javastory.wz.WzDataProviderFactory; import javastory.wz.WzDataTool; public final class LoginInfoProvider { private final static LoginInfoProvider instance = new LoginInfoProvider(); private final Map<Integer, Map<String, Integer>> equipStatsCache = Maps.newHashMap(); private final Map<Integer, Equip> equipCache = Maps.newHashMap(); private final List<String> nameFilter = Lists.newArrayList(); public static LoginInfoProvider getInstance() { return instance; } private LoginInfoProvider() { System.out.println(":: Loading LoginInformationProvider ::"); final int[] LoadEquipment = { 1040002, 1040006, 1040010, // top 1060006, 1060002, 1060138, // Bottom 1041002, 1041006, 1041010, 1041011, 1042167, 1042180, // Top 1061002, 1061008, 1062115, 1061160, // Bottom 1302000, 1322005, 1312004, 1442079, 1302132, // Weapon 1072001, 1072005, 1072037, 1072038, 1072383, 1072418 // Shoes }; final WzDataProvider equipData = WzDataProviderFactory.getDataProvider("Character.wz"); for (final int element : LoadEquipment) { this.loadEquipStats(element, equipData); } final WzData nameData = WzDataProviderFactory.getDataProvider("Etc.wz").getData("ForbiddenName.img"); for (final WzData data : nameData.getChildren()) { this.nameFilter.add(WzDataTool.getString(data)); } } private void loadEquipStats(final int itemId, final WzDataProvider equipData) { final WzData item = this.getItemData(itemId, equipData); if (item == null) { return; } final WzData info = item.getChildByPath("info"); if (info == null) { return; } final Map<String, Integer> ret = Maps.newLinkedHashMap(); for (final WzData data : info.getChildren()) { if (data.getName().startsWith("inc")) { ret.put(data.getName().substring(3), WzDataTool.getIntConvert(data)); } } ret.put("tuc", WzDataTool.getInt("tuc", info, 0)); ret.put("reqLevel", WzDataTool.getInt("reqLevel", info, 0)); ret.put("reqJob", WzDataTool.getInt("reqJob", info, 0)); ret.put("reqSTR", WzDataTool.getInt("reqSTR", info, 0)); ret.put("reqDEX", WzDataTool.getInt("reqDEX", info, 0)); ret.put("reqINT", WzDataTool.getInt("reqINT", info, 0)); ret.put("reqLUK", WzDataTool.getInt("reqLUK", info, 0)); ret.put("cash", WzDataTool.getInt("cash", info, 0)); ret.put("cursed", WzDataTool.getInt("cursed", info, 0)); ret.put("success", WzDataTool.getInt("success", info, 0)); this.equipStatsCache.put(itemId, ret); } private WzData getItemData(final int itemId, final WzDataProvider equipData) { final WzData ret = null; final String idStr = "0" + String.valueOf(itemId); final WzDataDirectoryEntry root = equipData.getRoot(); for (final WzDataDirectoryEntry topDir : root.getSubdirectories()) { for (final WzDataFileEntry iFile : topDir.getFiles()) { if (iFile.getName().equals(idStr + ".img")) { return equipData.getData(topDir.getName() + "/" + iFile.getName()); } } } return ret; } public final Item getEquipById(final int equipId) { final Equip equip = new Equip(equipId, (byte) 0, -1, (byte) 0); equip.setQuantity((short) 1); final Map<String, Integer> stats = this.equipStatsCache.get(equipId); if (stats != null) { for (final Entry<String, Integer> stat : stats.entrySet()) { final String key = stat.getKey(); switch (key) { case "STR": equip.setStr(stat.getValue().shortValue()); break; case "DEX": equip.setDex(stat.getValue().shortValue()); break; case "INT": equip.setInt(stat.getValue().shortValue()); break; case "LUK": equip.setLuk(stat.getValue().shortValue()); break; case "PAD": equip.setWatk(stat.getValue().shortValue()); break; case "PDD": equip.setWdef(stat.getValue().shortValue()); break; case "MAD": equip.setMatk(stat.getValue().shortValue()); break; case "MDD": equip.setMdef(stat.getValue().shortValue()); break; case "ACC": equip.setAcc(stat.getValue().shortValue()); break; case "EVA": equip.setAvoid(stat.getValue().shortValue()); break; case "Speed": equip.setSpeed(stat.getValue().shortValue()); break; case "Jump": equip.setJump(stat.getValue().shortValue()); break; case "MHP": equip.setHp(stat.getValue().shortValue()); break; case "MMP": equip.setMp(stat.getValue().shortValue()); break; case "tuc": equip.setUpgradeSlots(stat.getValue().byteValue()); break; case "afterImage": break; } } } this.equipCache.put(equipId, equip); return equip.copy(); } public final boolean isAllowedName(final String in) { for (final String name : this.nameFilter) { if (in.contains(name)) { return false; } } return true; } }