package handling.login; import client.MapleJob; import constants.GameConstants; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import tools.Triple; public class LoginInformationProvider { public enum JobType { 終極冒險家(-1, MapleJob.初心者.getId(), 100000000, false, false, false, false, true, false, false, false, false), 末日反抗軍(0, MapleJob.市民.getId(), 931000000, false, false, false, false, false, false, false, false, false), 冒險家(1, MapleJob.初心者.getId(), 4000000, false, false, false, false, false, false, false, false, false), 皇家騎士團(2, MapleJob.貴族.getId(), 130030000, false, false, false, false, false, true, false, false, false), 狂狼勇士(3, MapleJob.傳說.getId(), 914000000, false, false, false, false, true, false, false, false, false), 龍魔導士(4, MapleJob.龍魔導士.getId(), 900010000, false, false, false, false, true, false, false, false, false),//evan starter map - need to test tutorial 精靈遊俠(5, MapleJob.精靈遊俠.getId(), 910150000, false, false, false, false, false, false, false, false, false),//101050000 - 910150000 惡魔(6, MapleJob.惡魔殺手.getId(), 931050310, false, false, true, false, false, false, false, false, false), 幻影俠盜(7, MapleJob.幻影俠盜.getId(), 915000000, false, false, false, false, false, true, false, false, false), 影武者(8, MapleJob.初心者.getId(), 103050900, false, false, false, false, false, false, false, false, false), 米哈逸(9, MapleJob.米哈逸.getId(), 913070000, false, false, false, false, true, false, false, false, false), 夜光(10, MapleJob.夜光.getId(), 101000000, false, false, false, false, false, true, false, false, false),//Ellinia atm TODO tutorial 凱撒(11, MapleJob.凱撒.getId(), 400000000, false, false, false, false, false, false, false, false, false), 天使破壞者(12, MapleJob.天使破壞者.getId(), 940011000, false, false, false, false, false, false, false, false, false),//400000000 - 940011000 - town now TODO tutorial 重砲指揮官(13, MapleJob.初心者.getId(), 0, false, false, false, false, false, false, false, false, false), 傑諾(14, MapleJob.傑諾.getId(), 931050920, false, false, true, false, false, false, false, false, false), 神之子(15, MapleJob.神之子.getId(), 100000000, false, false, false, false, false, true, false, false, false),//321000000 = zero starter map 隱月(16, MapleJob.隱月.getId(), 910000000, false, false, false, false, true, true, false, false, false), 蒼龍俠客(17, MapleJob.初心者.getId(), 552000050, false, false, false, false, true, false, false, false, false),//End map for tutorial 劍豪(18, MapleJob.劍豪.getId(), 807100010, false, false, false, true, false, false, false, false, true),//half stater map TODO real tutorial 陰陽師(19, MapleJob.陰陽師.getId(), 807100110, false, false, false, true, false, false, false, false, true), 幻獸師(20, MapleJob.幻獸師.getId(), 866135000, false, false, true, false, false, false, true, true, false);//custom tutorial as original tut is borinq public int type, id, map; public boolean hairColor, skinColor, faceMark, hat, bottom, cape, ears, tail, glove; private JobType(int type, int id, int map, boolean hairColor, boolean skinColor, boolean faceMark, boolean hat, boolean bottom, boolean cape, boolean ears, boolean tail, boolean glove) { this.type = type; this.id = id; this.map = map; this.hairColor = hairColor; this.skinColor = skinColor; this.faceMark = faceMark; this.hat = hat; this.bottom = bottom; this.cape = cape; this.ears = ears; this.tail = tail; this.glove = glove; } public static JobType getByType(int g) { if (g == JobType.重砲指揮官.type) { return JobType.冒險家; } for (JobType e : JobType.values()) { if (e.type == g) { return e; } } return null; } public static JobType getById(int g) { if (g == JobType.冒險家.id) { return JobType.冒險家; } if (g == 508) { return JobType.蒼龍俠客; } for (JobType e : JobType.values()) { if (e.id == g) { return e; } } return null; } } private final static LoginInformationProvider instance = new LoginInformationProvider(); protected final List<String> ForbiddenName = new ArrayList<>(); //gender, val, job protected final Map<Triple<Integer, Integer, Integer>, List<Integer>> makeCharInfo = new HashMap<>(); //0 = eyes 1 = hair 2 = haircolor 3 = skin 4 = top 5 = bottom 6 = shoes 7 = weapon public static LoginInformationProvider getInstance() { return instance; } protected LoginInformationProvider() { final MapleDataProvider prov = MapleDataProviderFactory.getDataProvider("/Etc.wz"); MapleData nameData = prov.getData("ForbiddenName.img"); for (final MapleData data : nameData.getChildren()) { ForbiddenName.add(MapleDataTool.getString(data)); } nameData = prov.getData("Curse.img"); for (final MapleData data : nameData.getChildren()) { ForbiddenName.add(MapleDataTool.getString(data).split(",")[0]); } final MapleData infoData = prov.getData("MakeCharInfo.img"); final MapleData data = infoData.getChildByPath("Info"); for (MapleData dat : infoData) { try { final int type; if (dat.getName().equals("000_1")) { type = JobType.影武者.type; } else { type = JobType.getById(Integer.parseInt(dat.getName())).type; } for (MapleData d : dat) { int val; if (d.getName().contains("female")) { val = 1; } else if (d.getName().contains("male")) { val = 0; } else { continue; } for (MapleData da : d) { int index; Triple<Integer, Integer, Integer> key; index = Integer.parseInt(da.getName()); key = new Triple<>(val, index, type); List<Integer> our = makeCharInfo.get(key); if (our == null) { our = new ArrayList<>(); makeCharInfo.put(key, our); } for (MapleData dd : da) { if (dd.getName().equalsIgnoreCase("color")) { for (MapleData dda : dd) { for (MapleData ddd : dda) { our.add(MapleDataTool.getInt(ddd, -1)); } } } else { try { our.add(MapleDataTool.getInt(dd, -1)); } catch (Exception ex) { //probably like color for (MapleData dda : dd) { for (MapleData ddd : dda) { our.add(MapleDataTool.getInt(ddd, -1)); } } } } } } } } catch (NumberFormatException | NullPointerException e) { } } final MapleData uA = infoData.getChildByPath("UltimateAdventurer"); for (MapleData dat : uA) { final Triple<Integer, Integer, Integer> key = new Triple<>(-1, Integer.parseInt(dat.getName()), JobType.終極冒險家.type); List<Integer> our = makeCharInfo.get(key); if (our == null) { our = new ArrayList<>(); makeCharInfo.put(key, our); } for (MapleData d : dat) { our.add(MapleDataTool.getInt(d, -1)); } } } public static boolean isExtendedSpJob(int jobId) { return GameConstants.isSeparatedSp(jobId); } public final boolean isForbiddenName(final String in) { for (final String name : ForbiddenName) { if (in.toLowerCase().contains(name.toLowerCase())) { return true; } } return false; } public final boolean isEligibleItem(final int gender, final int val, final int job, final int item) { if (item < 0) { return false; } final Triple<Integer, Integer, Integer> key = new Triple<>(gender, val, job); final List<Integer> our = makeCharInfo.get(key); if (our == null) { return false; } return our.contains(item); } }