package client;
import constants.GameConstants;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import server.life.MapleLifeFactory;
import server.quest.MapleQuest;
public class MapleQuestStatus implements Serializable {
private static final long serialVersionUID = 91795419934134L;
private transient MapleQuest quest;
private byte status;
private Map<Integer, Integer> killedMobs = null;
private int npc;
private long completionTime;
private int forfeited = 0;
private String customData;
/**
* Creates a new instance of MapleQuestStatus
*
* @param quest
* @param status
*/
public MapleQuestStatus(final MapleQuest quest, final int status) {
this.quest = quest;
this.setStatus((byte) status);
this.completionTime = System.currentTimeMillis();
if (status == 1) { // Started
if (!quest.getRelevantMobs().isEmpty()) {
registerMobs();
}
}
}
public MapleQuestStatus(final MapleQuest quest, final byte status, final int npc) {
this.quest = quest;
this.setStatus(status);
this.setNpc(npc);
this.completionTime = System.currentTimeMillis();
if (status == 1) { // Started
if (!quest.getRelevantMobs().isEmpty()) {
registerMobs();
}
}
}
public final void setQuest(int qid) {
this.quest = MapleQuest.getInstance(qid);
}
public final MapleQuest getQuest() {
return quest;
}
public final byte getStatus() {
return status;
}
public final void setStatus(final byte status) {
this.status = status;
}
public final int getNpc() {
return npc;
}
public final void setNpc(final int npc) {
this.npc = npc;
}
public boolean isCustom() {
return GameConstants.isCustomQuest(quest.getId());
}
private void registerMobs() {
killedMobs = new LinkedHashMap<>();
for (final int i : quest.getRelevantMobs().keySet()) {
killedMobs.put(i, 0);
}
}
private int maxMob(final int mobid) {
for (final Map.Entry<Integer, Integer> qs : quest.getRelevantMobs().entrySet()) {
if (qs.getKey() == mobid) {
return qs.getValue();
}
}
return 0;
}
public final boolean mobKilled(final int id, final int skillID) {
if (quest != null && quest.getSkillID() > 0) {
if (quest.getSkillID() != skillID) {
return false;
}
}
final Integer mob = killedMobs.get(id);
if (mob != null) {
final int mo = maxMob(id);
if (mob >= mo) {
return false; //nothing happened
}
killedMobs.put(id, Math.min(mob + 1, mo));
return true;
}
for (Entry<Integer, Integer> mo : killedMobs.entrySet()) {
if (questCount(mo.getKey(), id)) {
final int mobb = maxMob(mo.getKey());
if (mo.getValue() >= mobb) {
return false; //nothing
}
killedMobs.put(mo.getKey(), Math.min(mo.getValue() + 1, mobb));
return true;
}
} //i doubt this
return false;
}
private boolean questCount(final int mo, final int id) {
if (MapleLifeFactory.getQuestCount(mo) != null) {
for (int i : MapleLifeFactory.getQuestCount(mo)) {
if (i == id) {
return true;
}
}
}
return false;
}
public final void setMobKills(final int id, final int count) {
if (killedMobs == null) {
registerMobs(); //lol
}
killedMobs.put(id, count);
}
public final boolean hasMobKills() {
if (killedMobs == null) {
return false;
}
return killedMobs.size() > 0;
}
public final int getMobKills(final int id) {
final Integer mob = killedMobs.get(id);
if (mob == null) {
return 0;
}
return mob;
}
public final Map<Integer, Integer> getMobKills() {
return killedMobs;
}
public final long getCompletionTime() {
return completionTime;
}
public final void setCompletionTime(final long completionTime) {
this.completionTime = completionTime;
}
public final int getForfeited() {
return forfeited;
}
public final void setForfeited(final int forfeited) {
if (forfeited >= this.forfeited) {
this.forfeited = forfeited;
} else {
throw new IllegalArgumentException("Can't set forfeits to something lower than before.");
}
}
public final void setCustomData(final String customData) {
this.customData = customData;
}
public final String getCustomData() {
return customData;
}
}