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 tools.FileoutputUtil;
import tools.Pair;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MapleQuestComplete implements Serializable {
private static final long serialVersionUID = 9179541993413738569L;
private MapleQuestCompleteType type;
private List<Pair<Integer, Integer>> dataStore = new ArrayList();
/**
* 任务的必要条件
* @param type
* @throws SQLException
*/
public MapleQuestComplete(MapleQuestCompleteType type, int itemId,int num) throws SQLException {
this.type = type;
if (type == MapleQuestCompleteType.item) {
this.dataStore.add(new Pair(itemId,num));
} if (type == MapleQuestCompleteType.exp) {
this.dataStore.add(new Pair(itemId,num));
} else {
FileoutputUtil.log("暂时不支持的奖励类型:"+type.toString());
}
}
/**
* 检查任务是否能完成
* @param chr
* @return
*/
public boolean check(MapleCharacter chr) {
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 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;
}
return true;
}
public boolean removeQuestItem(MapleCharacter chr){
switch (type) {
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;
}
chr.removeItem(itemId,count);
}
return true;
}
return true;
}
public MapleQuestCompleteType getType() {
return this.type;
}
@Override
public String toString() {
return this.type.toString();
}
public List<Pair<Integer, Integer>> getDataStore() {
return this.dataStore;
}
}