package server.quest;
import java.util.Calendar;
import java.util.List;
import java.util.LinkedList;
import java.io.Serializable;
import client.MapleCharacter;
import client.MapleQuestStatus;
import client.Skill;
import client.SkillFactory;
import client.MapleTrait.MapleTraitType;
import client.inventory.Item;
import constants.GameConstants;
import client.inventory.MaplePet;
import client.inventory.MapleInventoryType;
import java.sql.ResultSet;
import java.sql.SQLException;
import tools.Pair;
public class MapleQuestRequirement implements Serializable {
private static final long serialVersionUID = 9179541993413738569L;
private MapleQuest quest;
private MapleQuestRequirementType type;
private int intStore;
private String stringStore;
private List<Pair<Integer, Integer>> dataStore;
/**
* Creates a new instance of MapleQuestRequirement
*/
public MapleQuestRequirement(MapleQuest quest, MapleQuestRequirementType type, ResultSet rse) throws SQLException {
this.type = type;
this.quest = quest;
switch (type) {
case pet:
case mbcard:
case mob:
case item:
case quest:
case skill:
case job: {
dataStore = new LinkedList<Pair<Integer, Integer>>();
String[] first = rse.getString("intStoresFirst").split(", ");
String[] second = rse.getString("intStoresSecond").split(", ");
if (first.length <= 0 && rse.getString("intStoresFirst").length() > 0) {
dataStore.add(new Pair<Integer, Integer>(Integer.parseInt(rse.getString("intStoresFirst")), Integer.parseInt(rse.getString("intStoresSecond"))));
}
for (int i = 0; i < first.length; i++) {
if (first[i].length() > 0 && second[i].length() > 0) {
dataStore.add(new Pair<Integer, Integer>(Integer.parseInt(first[i]), Integer.parseInt(second[i])));
}
}
break;
}
case partyQuest_S:
case dayByDay:
case normalAutoStart:
case subJobFlags:
case fieldEnter:
case pettamenessmin:
case npc:
case questComplete:
case pop:
case interval:
case mbmin:
case lvmax:
case lvmin: {
intStore = Integer.parseInt(rse.getString("stringStore"));
break;
}
case end: {
stringStore = rse.getString("stringStore");
break;
}
}
}
public boolean check(MapleCharacter c, Integer npcid) {
switch (type) {
case job:
for (Pair<Integer, Integer> a : dataStore) {
if (a.getRight() == c.getJob() || c.isGM()) {
return true;
}
}
return false;
case skill: {
for (Pair<Integer, Integer> a : dataStore) {
final boolean acquire = a.getRight() > 0;
final int skill = a.getLeft();
final Skill skil = SkillFactory.getSkill(skill);
if (acquire) {
if (skil.isFourthJob()) {
if (c.getMasterLevel(skil) == 0) {
return false;
}
} else {
if (c.getSkillLevel(skil) == 0) {
return false;
}
}
} else {
if (c.getSkillLevel(skil) > 0 || c.getMasterLevel(skil) > 0) {
return false;
}
}
}
return true;
}
case quest:
for (Pair<Integer, Integer> a : dataStore) {
final MapleQuestStatus q = c.getQuest(MapleQuest.getInstance(a.getLeft()));
final int state = a.getRight();
if (state != 0) {
if (q == null && state == 0) {
continue;
}
if (q == null || q.getStatus() != state) {
return false;
}
}
}
return true;
case item:
MapleInventoryType iType;
int itemId;
short quantity;
for (Pair<Integer, Integer> a : dataStore) {
itemId = a.getLeft();
quantity = 0;
iType = GameConstants.getInventoryType(itemId);
for (Item item : c.getInventory(iType).listById(itemId)) {
quantity += item.getQuantity();
}
final int count = a.getRight();
if (quantity < count || (count <= 0 && quantity > 0)) {
return false;
}
}
return true;
case lvmin:
return c.getLevel() >= intStore;
case lvmax:
return c.getLevel() <= intStore;
case end:
final String timeStr = stringStore;
if (timeStr == null || timeStr.length() <= 0) {
return true;
}
final Calendar cal = Calendar.getInstance();
cal.set(Integer.parseInt(timeStr.substring(0, 4)), Integer.parseInt(timeStr.substring(4, 6)), Integer.parseInt(timeStr.substring(6, 8)), Integer.parseInt(timeStr.substring(8, 10)), 0);
return cal.getTimeInMillis() >= System.currentTimeMillis();
case mob:
for (Pair<Integer, Integer> a : dataStore) {
final int mobId = a.getLeft();
final int killReq = a.getRight();
if (c.getQuest(quest).getMobKills(mobId) < killReq) {
return false;
}
}
return true;
case npc:
return npcid == null || npcid == intStore;
case fieldEnter:
if (intStore > 0) {
return intStore == c.getMapId();
}
return true;
case mbmin:
return c.getMonsterBook().getSeen() >= intStore;
case mbcard:
for (Pair<Integer, Integer> a : dataStore) {
final int cardId = a.getLeft();
final int killReq = a.getRight();
if (c.getMonsterBook().getLevelByCard(cardId) < killReq) {
return false;
}
}
return true;
case pop:
return c.getFame() >= intStore;
case questComplete:
return c.getNumQuest() >= intStore;
case interval:
return c.getQuest(quest).getStatus() != 2 || c.getQuest(quest).getCompletionTime() <= System.currentTimeMillis() - intStore * 60 * 1000L;
case pet:
for (Pair<Integer, Integer> a : dataStore) {
if (c.getPetById(a.getRight()) != -1) {
return true;
}
}
return false;
case pettamenessmin:
for (MaplePet pet : c.getPets()) {
if (pet.getSummoned() && pet.getCloseness() >= intStore) {
return true;
}
}
return false;
case partyQuest_S:
final int[] partyQuests = new int[]{1200, 1201, 1202, 1203, 1204, 1205, 1206, 1300, 1301, 1302};
int sRankings = 0;
for (int i : partyQuests) {
final String rank = c.getOneInfo(i, "rank");
if (rank != null && rank.equals("S")) {
sRankings++;
}
}
return sRankings >= 5;
case subJobFlags: // 1 for non-DB, 2 for DB...
return c.getSubcategory() == (intStore / 2);
case craftMin:
case willMin:
case charismaMin:
case insightMin:
case charmMin:
case senseMin:
return c.getTrait(MapleTraitType.getByQuestName(type.name())).getLevel() >= intStore;
default:
return true;
}
}
public MapleQuestRequirementType getType() {
return type;
}
@Override
public String toString() {
return type.toString();
}
public List<Pair<Integer, Integer>> getDataStore() {
return dataStore;
}
}