Method getEventQuests returns List and addition of getAllQuestStates method.

This commit is contained in:
MobiusDevelopment 2020-01-24 16:48:48 +00:00
parent 58fe3bdd8f
commit 4f5e72d88d
5 changed files with 48 additions and 59 deletions

View File

@ -765,10 +765,10 @@ public class NpcInstance extends Creature
}
else
{
final Quest[] qlst = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK);
if (qlst.length == 1)
final List<Quest> questList = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK);
if (questList.size() == 1)
{
qlst[0].notifyFirstTalk(this, player);
questList.get(0).notifyFirstTalk(this, player);
}
else
{
@ -1096,10 +1096,10 @@ public class NpcInstance extends Creature
}
else
{
final Quest[] qlst = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK);
if (qlst.length == 1)
final List<Quest> questList = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK);
if (questList.size() == 1)
{
qlst[0].notifyFirstTalk(this, player);
questList.get(0).notifyFirstTalk(this, player);
}
else
{
@ -1878,28 +1878,28 @@ public class NpcInstance extends Creature
final List<Quest> options = new ArrayList<>();
final List<QuestState> awaits = player.getQuestsForTalk(getTemplate().npcId);
final Quest[] starts = getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START);
final List<Quest> starts = getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START);
// Quests are limited between 1 and 999 because those are the quests that are supported by the client.
// By limiting them there, we are allowed to create custom quests at higher IDs without interfering
if (awaits != null)
{
for (QuestState x : awaits)
for (QuestState qs : awaits)
{
if (!options.contains(x.getQuest()) && (x.getQuest().getQuestId() > 0) && (x.getQuest().getQuestId() < 1000))
if (!options.contains(qs.getQuest()) && (qs.getQuest().getQuestId() > 0) && (qs.getQuest().getQuestId() < 1000))
{
options.add(x.getQuest());
options.add(qs.getQuest());
}
}
}
if (starts != null)
{
for (Quest x : starts)
for (Quest quest : starts)
{
if (!options.contains(x) && (x.getQuestId() > 0) && (x.getQuestId() < 1000))
if (!options.contains(quest) && (quest.getQuestId() > 0) && (quest.getQuestId() < 1000))
{
options.add(x);
options.add(quest);
}
}
}

View File

@ -1674,16 +1674,12 @@ public class PlayerInstance extends Playable
List<QuestState> states = new ArrayList<>();
// Go through the QuestState of the PlayerInstance quests
final Quest[] quests = NpcTable.getInstance().getTemplate(npcId).getEventQuests(Quest.QuestEventType.QUEST_TALK);
if (quests != null)
for (Quest quest : NpcTable.getInstance().getTemplate(npcId).getEventQuests(Quest.QuestEventType.QUEST_TALK))
{
for (Quest quest : quests)
// Copy the current PlayerInstance QuestState in the QuestState table
if ((quest != null) && (getQuestState(quest.getName()) != null))
{
// Copy the current PlayerInstance QuestState in the QuestState table
if ((quest != null) && (getQuestState(quest.getName()) != null))
{
states.add(getQuestState(quest.getName()));
}
states.add(getQuestState(quest.getName()));
}
}
@ -1691,6 +1687,11 @@ public class PlayerInstance extends Playable
return states;
}
public Collection<QuestState> getAllQuestStates()
{
return _quests.values();
}
/**
* Process quest event.
* @param quest the quest

View File

@ -18,6 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
@ -238,14 +239,14 @@ public class SepulcherNpcInstance extends NpcInstance
}
default:
{
if (getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START).length > 0)
if (!getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START).isEmpty())
{
player.setLastQuestNpcObject(getObjectId());
}
final Quest[] qlst = getTemplate().getEventQuests(Quest.QuestEventType.QUEST_TALK);
if (qlst.length == 1)
final List<Quest> questList = getTemplate().getEventQuests(Quest.QuestEventType.QUEST_TALK);
if (questList.size() == 1)
{
qlst[0].notifyFirstTalk(this, player);
questList.get(0).notifyFirstTalk(this, player);
}
else
{

View File

@ -17,6 +17,7 @@
package org.l2jmobius.gameserver.model.actor.templates;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
@ -125,7 +126,7 @@ public class NpcTemplate extends CreatureTemplate
private final Map<Integer, Skill> _skills = new HashMap<>();
private final Map<Stats, Double> _vulnerabilities = new EnumMap<>(Stats.class);
// contains a list of quests for each event type (questStart, questAttack, questKill, etc)
private final Map<QuestEventType, Quest[]> _questEvents = new EnumMap<>(QuestEventType.class);
private final Map<QuestEventType, List<Quest>> _questEvents = new EnumMap<>(QuestEventType.class);
/**
* Constructor of Creature.<BR>
@ -301,24 +302,22 @@ public class NpcTemplate extends CreatureTemplate
{
if (_questEvents.get(eventType) == null)
{
_questEvents.put(eventType, new Quest[]
{
q
});
final List<Quest> quests = new ArrayList<>();
quests.add(q);
_questEvents.put(eventType, quests);
}
else
{
final Quest[] quests = _questEvents.get(eventType);
final int len = quests.length;
final List<Quest> quests = _questEvents.get(eventType);
// If only one registration per npc is allowed for this event type then only register this NPC if not already registered for the specified event.
// If a quest allows multiple registrations, then register regardless of count.
// In all cases, check if this new registration is replacing an older copy of the SAME quest.
if (!eventType.isMultipleRegistrationAllowed())
{
if (quests[0].getName().equals(q.getName()))
if (quests.get(0).getName().equals(q.getName()))
{
quests[0] = q;
quests.add(0, q);
}
else
{
@ -327,30 +326,27 @@ public class NpcTemplate extends CreatureTemplate
}
else
{
// Be ready to add a new quest to a new copy of the list, with larger size than previously.
final Quest[] tmp = new Quest[len + 1];
// Loop through the existing quests and copy them to the new list. While doing so, also check if this new quest happens to be just a replacement for a previously loaded quest.
// If so, just save the updated reference and do NOT use the new list. Else, add the new quest to the end of the new list.
for (int i = 0; i < len; i++)
for (Quest quest : quests)
{
if (quests[i].getName().equals(q.getName()))
if (quest.getName().equals(q.getName()))
{
quests[i] = q;
quest = q;
return;
}
tmp[i] = quests[i];
}
tmp[len] = q;
_questEvents.put(eventType, tmp);
quests.add(q);
// _questEvents.put(eventType, quests);
}
}
}
public Quest[] getEventQuests(Quest.QuestEventType eventType)
public List<Quest> getEventQuests(Quest.QuestEventType eventType)
{
if (_questEvents.get(eventType) == null)
{
return new Quest[0];
return Collections.emptyList();
}
return _questEvents.get(eventType);
}

View File

@ -16,37 +16,28 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import java.util.List;
import java.util.Collection;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
public class QuestList extends GameServerPacket
{
private final List<Quest> _quests;
private final PlayerInstance _activeChar;
private final Collection<QuestState> _questStates;
public QuestList(PlayerInstance player)
{
_activeChar = player;
_quests = player.getAllActiveQuests();
_questStates = player.getAllQuestStates();
}
@Override
protected final void writeImpl()
{
writeC(0x80);
writeH(_quests.size());
for (Quest q : _quests)
writeH(_questStates.size());
for (QuestState qs : _questStates)
{
writeD(q.getQuestId());
final QuestState qs = _activeChar.getQuestState(q.getName());
if (qs == null)
{
writeD(0);
continue;
}
writeD(qs.getQuest().getQuestId());
final int states = qs.getInt("__compltdStateFlags");
if (states != 0)