One time quest mask calculation.

Based on malyelfik's quest rework shared on l2junity forum.
Note: Used modified L2S getCond() method because I could not get the original diff. xD
This commit is contained in:
MobiusDev
2016-12-06 21:56:50 +00:00
parent e4d77a1f2f
commit c78d4dc065
2 changed files with 41 additions and 43 deletions

View File

@@ -459,7 +459,21 @@ public final class QuestState
{ {
if (isStarted()) if (isStarted())
{ {
return getInt("cond"); int val = getInt("cond");
if ((val & 0x80000000) != 0)
{
val &= 0x7fffffff;
for (int i = 1; i < 32; i++)
{
val = (val >> 1);
if (val == 0)
{
val = i;
break;
}
}
}
return val;
} }
return 0; return 0;
} }

View File

@@ -16,68 +16,52 @@
*/ */
package com.l2jmobius.gameserver.network.serverpackets; package com.l2jmobius.gameserver.network.serverpackets;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import com.l2jmobius.commons.network.PacketWriter; import com.l2jmobius.commons.network.PacketWriter;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState; import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.network.client.OutgoingPackets; import com.l2jmobius.gameserver.network.client.OutgoingPackets;
public class QuestList implements IClientOutgoingPacket public class QuestList implements IClientOutgoingPacket
{ {
private final List<Quest> _quests; private final List<QuestState> _activeQuests;
private final L2PcInstance _player; private final byte[] _oneTimeQuestMask;
public QuestList(L2PcInstance player) public QuestList(L2PcInstance player)
{ {
_player = player; _activeQuests = new LinkedList<>();
_quests = player.getAllActiveQuests(); _oneTimeQuestMask = new byte[128];
for (QuestState qs : player.getAllQuestStates())
{
final int questId = qs.getQuest().getId();
if (questId > 0)
{
if (qs.isStarted())
{
_activeQuests.add(qs);
}
else if (qs.isCompleted() && !(((questId > 255) && (questId < 10256)) || (questId > 11023)))
{
_oneTimeQuestMask[(questId % 10000) / 8] |= 1 << (questId % 8);
}
}
}
} }
@Override @Override
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.QUEST_LIST.writeId(packet); OutgoingPackets.QUEST_LIST.writeId(packet);
packet.writeH(_quests.size()); packet.writeH(_activeQuests.size());
for (Quest quest : _quests) for (QuestState qs : _activeQuests)
{
packet.writeD(quest.getId());
final QuestState qs = _player.getQuestState(quest.getName());
if (qs == null)
{
packet.writeD(0);
continue;
}
final int states = qs.getInt("__compltdStateFlags");
if (states != 0)
{
packet.writeD(states);
}
else
{ {
packet.writeD(qs.getQuest().getId());
packet.writeD(qs.getCond()); packet.writeD(qs.getCond());
} }
} packet.writeB(_oneTimeQuestMask);
final byte[] oneTimeQuestMask = new byte[128];
for (QuestState questState : _player.getAllQuestStates())
{
if (questState.isCompleted())
{
final int questId = questState.getQuest().getId();
if ((questId < 0) || ((questId > 255) && (questId < 10256)) || (questId > 11023))
{
continue;
}
oneTimeQuestMask[(questId % 10000) / 8] |= 1 << (questId % 8);
}
}
packet.writeB(oneTimeQuestMask);
return true; return true;
} }
} }