/* * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) any later version. 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.gameserver.network.serverpackets; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.quest.Quest; import silentium.gameserver.model.quest.QuestState; public class QuestList extends L2GameServerPacket { private Quest[] _quests; private L2PcInstance _activeChar; @Override public void runImpl() { if (getClient() != null && getClient().getActiveChar() != null) { _activeChar = getClient().getActiveChar(); _quests = _activeChar.getAllActiveQuests(); } } @Override protected final void writeImpl() { /** * This text was wrote by XaKa QuestList packet structure: { 1 byte - 0x80 2 byte - Number of Quests for Quest in AvailibleQuests { 4 * byte - Quest ID 4 byte - Quest Status } } NOTE: The following special constructs are true for the 4-byte Quest Status: If the most * significant bit is 0, this means that no progress-step got skipped. In this case, merely passing the rank of the latest step gets the * client to mark it as current and mark all previous steps as complete. If the most significant bit is 1, it means that some steps may * have been skipped. In that case, each bit represents a quest step (max 30) with 0 indicating that it was skipped and 1 indicating that * it either got completed or is currently active (the client will automatically assume the largest step as active and all smaller ones * as completed). For example, the following bit sequences will yield the same results: 1000 0000 0000 0000 0000 0011 1111 1111: * Indicates some steps may be skipped but each of the first 10 steps did not get skipped and current step is the 10th. 0000 0000 0000 * 0000 0000 0000 0000 1010: Indicates that no steps were skipped and current is the 10th. It is speculated that the latter will be * processed faster by the client, so it is preferred when no steps have been skipped. However, the sequence * "1000 0000 0000 0000 0000 0010 1101 1111" indicates that the current step is the 10th but the 6th and 9th are not to be shown at all * (not completed, either). */ if ((_quests == null) || (_quests.length == 0)) { writeC(0x80); writeH(0); writeH(0); return; } writeC(0x80); writeH(_quests.length); for (Quest q : _quests) { writeD(q.getQuestIntId()); QuestState qs = _activeChar.getQuestState(q.getName()); if (qs == null) { writeD(0); continue; } int states = qs.getInt("__compltdStateFlags"); if (states != 0) writeD(states); else writeD(qs.getInt("cond")); } } }