package handling.login;
import constants.GameConstants;
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 {
private static final LoginInformationProvider instance = new LoginInformationProvider();
protected final List<String> ForbiddenName = new ArrayList();
protected final Map<Triple<Integer, Integer, Integer>, List<Integer>> makeCharInfo = new HashMap();
public static LoginInformationProvider getInstance() {
return instance;
}
protected LoginInformationProvider() {
final String WZpath = System.getProperty("net.sf.odinms.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")) { // comes first..
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<Integer, Integer, Integer>(val, Integer.parseInt(da.getName()), job);
List<Integer> our = makeCharInfo.get(key);
if (our == null) {
our = new ArrayList<Integer>();
makeCharInfo.put(key, our);
}
for (MapleData d : da) {
our.add(MapleDataTool.getInt(d, -1));
}
}
}
if (GameConstants.GMS) { //TODO LEGEND
for (MapleData dat : infoData) {
try {
final int type = JobType.getById(Integer.parseInt(dat.getName())).type;
for (MapleData d : dat) {
int val;
if (d.getName().endsWith("female")) {
val = 1;
} else if (d.getName().endsWith("male")) {
val = 0;
} else {
continue;
}
for (MapleData da : d) {
final Triple<Integer, Integer, Integer> key = new Triple<Integer, Integer, Integer>(val, Integer.parseInt(da.getName()), type);
List<Integer> our = makeCharInfo.get(key);
if (our == null) {
our = new ArrayList<Integer>();
makeCharInfo.put(key, our);
}
for (MapleData dd : da) {
our.add(MapleDataTool.getInt(dd, -1));
}
}
}
} catch (NumberFormatException e) {
}
}
}
final MapleData uA = infoData.getChildByPath("UltimateAdventurer");
for (MapleData dat : uA) {
final Triple<Integer, Integer, Integer> key = new Triple<Integer, Integer, Integer>(-1, Integer.parseInt(dat.getName()), JobType.UltimateAdventurer.type);
List<Integer> our = makeCharInfo.get(key);
if (our == null) {
our = new ArrayList<Integer>();
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(String in) {
for (String name : this.ForbiddenName) {
if (in.toLowerCase().contains(name.toLowerCase())) {
return true;
}
}
return false;
}
public final boolean isEligibleItem(int gender, int val, int job, int item) {
if (item < 0) {
return false;
}
Triple key = new Triple(Integer.valueOf(gender), Integer.valueOf(val), Integer.valueOf(job));
List our = (List) this.makeCharInfo.get(key);
if (our == null) {
return false;
}
return our.contains(Integer.valueOf(item));
}
public static enum JobType {
UltimateAdventurer(-1, "Ultimate", 0, 130000000),
Resistance(0, "Resistance", 3000, 931000000),
Adventurer(1, "", 0, 10000),
Cygnus(2, "Premium", 1000, 913040000),
Aran(3, "Orient", 2000, 914000000),
Evan(4, "Evan", 2001, 900090000),
Mercedes(5, "", 2002, 910150000),
Demon(6, "", 3001, 931050310),
Phantom(7, "", 2003, 10000),
DualBlade(8, "", 0, 103050900),
Mihile(9, "", 5000, 913070000),
Jett(10, "", 508, 10000),
Luminous(11, "", 2004, 10000),
Kaiser(12, "", 6000, 10000),
CANNONEER(13, "CANNONEER", 530, 10000),
Xenon(14, "", 0, 10000),
AngelicBurster(15, "", 6001, 10000);
public int type;
public int id;
public int map;
public String job;
private JobType(int type, String job, int id, int map) {
this.type = type;
this.job = job;
this.id = id;
this.map = map;
}
public static JobType getByJob(String g) {
for (JobType e : values()) {
if ((e.job.length() > 0) && (g.startsWith(e.job))) {
return e;
}
}
return Adventurer;
}
public static JobType getByType(int g) {
for (JobType e : values()) {
if (e.type == g) {
return e;
}
}
return Adventurer;
}
public static JobType getById(int g) {
for (JobType e : values()) {
if ((e.id == g) || ((g == 508) && (e.type == 8))) {
return e;
}
}
return Adventurer;
}
}
public enum JobType2 {
resistance((byte) 0),
adventurer((byte) 1),
cygnus((byte) 2),
aran((byte) 3),
evan((byte) 4),
mercedes((byte) 5),
demon((byte) 6),
phantom((byte) 7),
dualblade((byte) 8),
mihile((byte) 9),
zen((byte) 10),
luminous((byte) 11),
kaiser((byte) 12),
angelicbuster((byte) 13),
xenon((byte) 14),
demonavenger((byte) 15);
private byte jobCode = -1;
private JobType2(byte type) {
this.jobCode = type;
}
public byte getValue() {
return jobCode;
}
}
}