/* * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * * L2J Server 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. * * L2J Server 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 com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; public class QuestList extends L2GameServerPacket { private Quest[] _quests; private L2PcInstance _activeChar; public QuestList() { } @Override public void runImpl() { if ((getClient() != null) && (getClient().getActiveChar() != null)) { _activeChar = getClient().getActiveChar(); _quests = _activeChar.getAllActiveQuests(); } } @Override protected final void writeImpl() { /** * <pre> * 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). * </pre> */ writeC(0x86); if (_quests != null) { writeH(_quests.length); for (Quest q : _quests) { writeD(q.getId()); 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")); } } } else { // write empty size writeH(0x00); } writeB(new byte[128]); } }