/* * This file is part of the OdinMS Maple Story Server Copyright (C) 2008 ~ 2010 * Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan * Christian Meyer <vimes@odinms.de> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License version 3 as published by * the Free Software Foundation. You may not use, modify or distribute this * program under any other version of the GNU Affero General Public License. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package javastory.game.quest; import java.io.Serializable; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; import com.google.common.collect.Maps; import javastory.game.quest.QuestInfoProvider.QuestInfo; public final class QuestStatus implements Serializable { private final int questId; private static final long serialVersionUID = 91795419934134L; private byte state; private Map<Integer, Integer> killedMobs = null; private int npcId; private long completionTime; private int forfeited = 0; private String customData; public QuestStatus(final int questId, final byte status) { this.questId = questId; this.state = status; this.completionTime = System.currentTimeMillis(); if (status == 1) { if (this.getQuestInfo().getRelevantMobs().size() > 0) { this.killedMobs = Maps.newLinkedHashMap(); this.registerMobs(); } } } public QuestStatus(final int questId, final byte status, final int npc) { this(questId, status); this.setNpc(npc); } public QuestStatus(final ResultSet rs) throws SQLException { this.state = rs.getByte("status"); this.questId = rs.getInt("quest"); final long timestamp = rs.getLong("time"); this.completionTime = timestamp; if (timestamp > -1) { this.completionTime *= 1000; } this.forfeited = rs.getInt("forfeited"); this.customData = rs.getString("customData"); } private QuestInfo getQuestInfo() { return QuestInfoProvider.getInfo(this.questId); } public int getQuestId() { return this.questId; } public byte getState() { return this.state; } public void setState(final byte status) { this.state = status; } public int getNpc() { return this.npcId; } public void setNpc(final int npc) { this.npcId = npc; } private void registerMobs() { for (final int i : this.getQuestInfo().getRelevantMobs().keySet()) { this.killedMobs.put(i, 0); } } private int maxMob(final int monsterId) { for (final Map.Entry<Integer, Integer> qs : this.getQuestInfo().getRelevantMobs().entrySet()) { if (qs.getKey() == monsterId) { return qs.getValue(); } } return 0; } public boolean mobKilled(final int monsterId) { final Integer mob = this.killedMobs.get(monsterId); if (mob != null) { this.killedMobs.put(monsterId, Math.min(mob + 1, this.maxMob(monsterId))); return true; } return false; } public void setMobKills(final int monsterId, final int count) { this.killedMobs.put(monsterId, count); } public boolean hasMobKills() { if (this.killedMobs == null) { return false; } return this.killedMobs.size() > 0; } public int getMobKills(final int monsterId) { final Integer mob = this.killedMobs.get(monsterId); if (mob == null) { return 0; } return mob; } public Map<Integer, Integer> getMobKills() { return this.killedMobs; } public long getCompletionTime() { return this.completionTime; } public int getForfeited() { return this.forfeited; } public String getCustomData() { return this.customData; } public void setCustomData(final String data) { this.customData = data; } public void forfeit() { if (this.state != (byte) 1) { return; } this.forfeited++; this.state = 0; } public void start(final int npcId, final String customData) { this.state = 1; this.customData = customData; this.npcId = npcId; } public void complete(final int npcId) { this.state = 2; this.completionTime = System.currentTimeMillis(); this.npcId = npcId; } }