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 else
{ {
final Quest[] qlst = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK); final List<Quest> questList = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK);
if (qlst.length == 1) if (questList.size() == 1)
{ {
qlst[0].notifyFirstTalk(this, player); questList.get(0).notifyFirstTalk(this, player);
} }
else else
{ {
@@ -1096,10 +1096,10 @@ public class NpcInstance extends Creature
} }
else else
{ {
final Quest[] qlst = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK); final List<Quest> questList = getTemplate().getEventQuests(Quest.QuestEventType.NPC_FIRST_TALK);
if (qlst.length == 1) if (questList.size() == 1)
{ {
qlst[0].notifyFirstTalk(this, player); questList.get(0).notifyFirstTalk(this, player);
} }
else else
{ {
@@ -1878,28 +1878,28 @@ public class NpcInstance extends Creature
final List<Quest> options = new ArrayList<>(); final List<Quest> options = new ArrayList<>();
final List<QuestState> awaits = player.getQuestsForTalk(getTemplate().npcId); 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. // 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 // By limiting them there, we are allowed to create custom quests at higher IDs without interfering
if (awaits != null) 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) 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,10 +1674,7 @@ public class PlayerInstance extends Playable
List<QuestState> states = new ArrayList<>(); List<QuestState> states = new ArrayList<>();
// Go through the QuestState of the PlayerInstance quests // Go through the QuestState of the PlayerInstance quests
final Quest[] quests = NpcTable.getInstance().getTemplate(npcId).getEventQuests(Quest.QuestEventType.QUEST_TALK); for (Quest quest : NpcTable.getInstance().getTemplate(npcId).getEventQuests(Quest.QuestEventType.QUEST_TALK))
if (quests != null)
{
for (Quest quest : quests)
{ {
// Copy the current PlayerInstance QuestState in the QuestState table // Copy the current PlayerInstance QuestState in the QuestState table
if ((quest != null) && (getQuestState(quest.getName()) != null)) if ((quest != null) && (getQuestState(quest.getName()) != null))
@@ -1685,12 +1682,16 @@ public class PlayerInstance extends Playable
states.add(getQuestState(quest.getName())); states.add(getQuestState(quest.getName()));
} }
} }
}
// Return a list containing all QuestState to modify // Return a list containing all QuestState to modify
return states; return states;
} }
public Collection<QuestState> getAllQuestStates()
{
return _quests.values();
}
/** /**
* Process quest event. * Process quest event.
* @param quest the quest * @param quest the quest

View File

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

View File

@@ -17,6 +17,7 @@
package org.l2jmobius.gameserver.model.actor.templates; package org.l2jmobius.gameserver.model.actor.templates;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -125,7 +126,7 @@ public class NpcTemplate extends CreatureTemplate
private final Map<Integer, Skill> _skills = new HashMap<>(); private final Map<Integer, Skill> _skills = new HashMap<>();
private final Map<Stats, Double> _vulnerabilities = new EnumMap<>(Stats.class); private final Map<Stats, Double> _vulnerabilities = new EnumMap<>(Stats.class);
// contains a list of quests for each event type (questStart, questAttack, questKill, etc) // 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> * Constructor of Creature.<BR>
@@ -301,24 +302,22 @@ public class NpcTemplate extends CreatureTemplate
{ {
if (_questEvents.get(eventType) == null) if (_questEvents.get(eventType) == null)
{ {
_questEvents.put(eventType, new Quest[] final List<Quest> quests = new ArrayList<>();
{ quests.add(q);
q _questEvents.put(eventType, quests);
});
} }
else else
{ {
final Quest[] quests = _questEvents.get(eventType); final List<Quest> quests = _questEvents.get(eventType);
final int len = quests.length;
// 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 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. // 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. // In all cases, check if this new registration is replacing an older copy of the SAME quest.
if (!eventType.isMultipleRegistrationAllowed()) 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 else
{ {
@@ -327,30 +326,27 @@ public class NpcTemplate extends CreatureTemplate
} }
else 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. // 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. // 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; return;
} }
tmp[i] = quests[i];
} }
tmp[len] = q; quests.add(q);
_questEvents.put(eventType, tmp); // _questEvents.put(eventType, quests);
} }
} }
} }
public Quest[] getEventQuests(Quest.QuestEventType eventType) public List<Quest> getEventQuests(Quest.QuestEventType eventType)
{ {
if (_questEvents.get(eventType) == null) if (_questEvents.get(eventType) == null)
{ {
return new Quest[0]; return Collections.emptyList();
} }
return _questEvents.get(eventType); return _questEvents.get(eventType);
} }

View File

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