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:
@@ -459,7 +459,21 @@ public final class QuestState
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@@ -16,68 +16,52 @@
|
||||
*/
|
||||
package com.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jmobius.commons.network.PacketWriter;
|
||||
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.network.client.OutgoingPackets;
|
||||
|
||||
public class QuestList implements IClientOutgoingPacket
|
||||
{
|
||||
private final List<Quest> _quests;
|
||||
private final L2PcInstance _player;
|
||||
private final List<QuestState> _activeQuests;
|
||||
private final byte[] _oneTimeQuestMask;
|
||||
|
||||
public QuestList(L2PcInstance player)
|
||||
{
|
||||
_player = player;
|
||||
_quests = player.getAllActiveQuests();
|
||||
_activeQuests = new LinkedList<>();
|
||||
_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
|
||||
public boolean write(PacketWriter packet)
|
||||
{
|
||||
OutgoingPackets.QUEST_LIST.writeId(packet);
|
||||
packet.writeH(_quests.size());
|
||||
for (Quest quest : _quests)
|
||||
packet.writeH(_activeQuests.size());
|
||||
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.getCond());
|
||||
}
|
||||
packet.writeD(qs.getQuest().getId());
|
||||
packet.writeD(qs.getCond());
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
packet.writeB(_oneTimeQuestMask);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user