/* This file is part of the OdinMS Maple Story Server Copyright (C) 2008 ~ 2010 Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan Christian Meyer <vimes@odinms.de> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation. You may not use, modify or distribute this program under any other version of the GNU Affero General Public License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package handling.login; import constants.GameConstants; import constants.ServerConfig; import java.io.File; 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 { UltimateAdventurer(-1, 0, 100000000, true, true, false, false, true, false), Resistance(0, 3000, 931000000, true, true, false, false, true, false),//tutorial works 100% Adventurer(1, 0, 4000000, false, true, false, false, false, false), Cygnus(2, 1000, 130030000, false, true, false, false, false, true), Aran(3, 2000, 914000000, true, true, false, false, true, false), Evan(4, 2001, 900010000, true, true, false, false, true, false),//evan starter map - need to test tutorial Mercedes(5, 2002, 910150000, false, false, false, false, false, false),//101050000 - 910150000 Demon(6, 3001, 931050310, false, false, true, false, false, false), Phantom(7, 2003, 915000000, false, true, false, false, false, true), DualBlade(8, 0, 103050900, false, true, false, false, false, false),//tutorial fixed Mihile(9, 5000, 913070000, true, true, false, false, true, false), Luminous(10, 2004, 931030000, false, true, false, false, false, true),//Ellinia atm TODO tutorial Kaiser(11, 6000, 940001000, false, true, false, false, false, false), AngelicBuster(12, 6001, 940011000, false, true, false, false, false, false),//400000000 - 940011000 - town now TODO tutorial Cannoneer(13, 0, 3000000, true, true, false, false, true, false),//portal problem Xenon(14, 3002, 931050920, true, true, true, false, false, false), Zero(15, 10112, 321000000, false, true, false, false, false, true),//create tutorial plox Jett(16, 0, 552000050, false, false, false, false, false, true),//End map for tutorial Hayato(17, 4001, 807000000, true, true, false, true, false, false),//half stater map TODO real tutorial Kanna(18, 4002, 807040000, true, true, false, true, false, false); public int type, id, map; public boolean hairColor, skinColor, faceMark, hat, bottom, cape; private JobType(int type, int id, int map, boolean hairColor, boolean skinColor, boolean faceMark, boolean hat, boolean bottom, boolean cape) { this.type = type; this.id = id; this.map = type == 0 ? map : type == 8 ? map : ServerConfig.STARTER_MAP; this.hairColor = hairColor; this.skinColor = skinColor; this.faceMark = faceMark; this.hat = hat; this.bottom = bottom; this.cape = cape; } public static JobType getByType(int g) { if (g == JobType.Cannoneer.type) { return JobType.Adventurer; } for (JobType e : JobType.values()) { if (e.type == g) { return e; } } return null; } public static JobType getById(int g) { if (g == JobType.Adventurer.id) { return JobType.Adventurer; } if (g == 508) { return JobType.Jett; } 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 String WZpath = System.getProperty("wzpath"); final MapleDataProvider prov = MapleDataProviderFactory.getDataProvider(new File(WZpath + "/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 : data) { int val = -1; if (dat.getName().endsWith("Female")) { val = 1; } else if (dat.getName().endsWith("Male")) { val = 0; } final int job = JobType.getByJob(dat.getName()).type; for (MapleData da : dat) { final Triple<Integer, Integer, Integer> key = new Triple<>(val, Integer.parseInt(da.getName()), job); List<Integer> our = makeCharInfo.get(key); if (our == null) { our = new ArrayList<>(); makeCharInfo.put(key, our); } for (MapleData d : da) { our.add(MapleDataTool.getInt(d, -1)); } } } */ for (MapleData dat : infoData) { try { final int type; if (dat.getName().equals("000_1")) { type = JobType.DualBlade.type; } else { type = JobType.getById(Integer.parseInt(dat.getName())).type; } for (MapleData d : dat) { int val; /* if (d.getName().contains("info")) { for (MapleData da : d) { if (da.getName().equalsIgnoreCase("choosableGender")) { int choosable = Integer.parseInt(da.getName()); if (choosable > 1) { if (choosable == 2) { //val = 0; //Forced male } else if (choosable == 3) { //val = 1; //Forced Female } } } } }*/ 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.UltimateAdventurer.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); } }