/*
* 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"));
}
}
}