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())
{
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;
}

View File

@@ -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;
}
}