package server.quest; import client.MapleCharacter; import client.MapleQuestStatus; import client.Skill; import client.SkillFactory; import client.inventory.Item; import client.inventory.MapleInventoryType; import client.inventory.MaplePet; import constants.ItemConstants; import java.io.Serializable; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Calendar; import java.util.LinkedList; import java.util.List; 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; /** * 任务的必要条件 * @param quest * @param type * @param rse * @throws SQLException */ public MapleQuestRequirement(MapleQuest quest, MapleQuestRequirementType type, ResultSet rse) throws SQLException { this.type = type; this.quest = quest; this.intStore = Integer.parseInt(rse.getString("stringStore")); } public boolean check(MapleCharacter chr, Integer npcid) { switch (type) { case job: for (Pair a : this.dataStore) { if ((((Integer) a.getRight()) == chr.getJob()) || (chr.isGM())) { return true; } } return false; case skill: for (Pair a : this.dataStore) { boolean acquire = ((Integer) a.getRight()) > 0; int skill = ((Integer) a.getLeft()); Skill skil = SkillFactory.getSkill(skill); if (acquire) { if (chr.getSkillLevel(skil) == 0) { return false; } } else if ((chr.getSkillLevel(skil) > 0) || (chr.getMasterLevel(skil) > 0)) { return false; } } return true; case quest: for (Pair a : this.dataStore) { MapleQuestStatus q = chr.getQuest(MapleQuest.getInstance(((Integer) a.getLeft()).intValue())); int state = ((Integer) a.getRight()); if (state != 0) { if ((q == null) && (state == 0)) { continue; } if ((q == null) || (q.getStatus() != state)) { return false; } } } return true; case item: for (Pair a : this.dataStore) { int itemId = ((Integer) a.getLeft()); short quantity = 0; MapleInventoryType iType = ItemConstants.getInventoryType(itemId); for (Item item : chr.getInventory(iType).listById(itemId)) { quantity = (short) (quantity + item.getQuantity()); } int count = ((Integer) a.getRight()); if ((quantity < count) || ((count <= 0) && (quantity > 0))) { return false; } } return true; case lvmin: return chr.getLevel() >= this.intStore; case lvmax: return chr.getLevel() <= this.intStore; case end: String timeStr = this.stringStore; if ((timeStr == null) || (timeStr.length() <= 0)) { return true; } 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 a : this.dataStore) { int mobId = ((Integer) a.getLeft()); int killReq = ((Integer) a.getRight()); if (chr.getQuest(this.quest).getMobKills(mobId) < killReq) { return false; } } return true; case npc: return (npcid == null) || (npcid == this.intStore); case fieldEnter: if (this.intStore > 0) { return this.intStore == chr.getMapId(); } return true; case pop: return chr.getFame() >= this.intStore; case questComplete: return chr.getNumQuest() >= this.intStore; case interval: return (chr.getQuest(this.quest).getStatus() != 2) || (chr.getQuest(this.quest).getCompletionTime() <= System.currentTimeMillis() - this.intStore * 60 * 1000L); case pet: for (Pair a : this.dataStore) { if (chr.getSpawnPet() != null) { return true; } } return false; case pettamenessmin: MaplePet pet = chr.getSpawnPets(); if ((pet != null) && (pet.getSummoned()) && (pet.getCloseness() >= this.intStore)) { return true; } return false; case partyQuest_S: int[] partyQuests = {1200, 1201, 1202, 1203, 1204, 1205, 1206, 1300, 1301, 1302}; int sRankings = 0; for (int i : partyQuests) { String rank = chr.getOneInfo(i, "rank"); if ((rank != null) && (rank.equals("S"))) { sRankings++; } } return sRankings >= 5; case subJobFlags: return chr.getSubcategory() == this.intStore / 2; case craftMin: case willMin: case charismaMin: case insightMin: case charmMin: case senseMin: // case interval: // case startscript: } return true; } public MapleQuestRequirementType getType() { return this.type; } @Override public String toString() { return this.type.toString(); } public List<Pair<Integer, Integer>> getDataStore() { return this.dataStore; } }