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 provider.MapleDataProvider; import server.MapleItemInformationProvider; import tools.FileoutputUtil; import tools.Pair; import java.io.Serializable; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class MapleQuestReward implements Serializable { private static final long serialVersionUID = 9179541993413738569L; private MapleQuestRewardType type; private int intStore; private List<Pair<Integer, Integer>> dataStore = new ArrayList(); /** * 任务的必要条件 * @param type * @param rse * @throws SQLException */ public MapleQuestReward(MapleQuestRewardType type, ResultSet rse) throws SQLException { this.type = type; if (type == MapleQuestRewardType.item) { this.dataStore.add(new Pair(rse.getInt("itemId"),rse.getInt("num"))); } else if (type == MapleQuestRewardType.exp){ this.dataStore.add(new Pair(rse.getInt("id"),rse.getInt("num"))); } else if (type == MapleQuestRewardType.pop){ this.dataStore.add(new Pair(rse.getInt("id"),rse.getInt("num"))); }else { FileoutputUtil.log("暂时不支持的奖励类型:"+type.toString()); } } /** * * @param chr * @return */ public boolean getRewardToChr(MapleCharacter chr){ switch (type) { case item: for (Pair a : this.dataStore) { int itemId = ((Integer) a.getLeft()); int count = ((Integer) a.getRight()); chr.gainItem(itemId,count,"任务获得道具!"); String itemName = MapleItemInformationProvider.getInstance().getName(itemId); if (itemName == null) { itemName = String.valueOf(itemId); } chr.dropMessage(0,"任务奖励:"+ itemName + " "+count+"个!"); } break; case exp: for (Pair a : this.dataStore) { int count = ((Integer) a.getRight()); chr.gainExp(count,true,false,false); } break; case pop: for (Pair a : this.dataStore) { int count = ((Integer) a.getRight()); chr.addFame(count); } default: FileoutputUtil.log("没有处理的奖励类型::"+type); break; } return true; } 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 mob: // @TODO 给召唤几只怪物吧 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 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 MapleQuestRewardType getType() { return this.type; } @Override public String toString() { return this.type.toString(); } public List<Pair<Integer, Integer>> getDataStore() { return this.dataStore; } }