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
	 MobiusDev
					MobiusDev