diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java index fb8ccec272..33a2053d9b 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java @@ -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 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 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 options = new ArrayList<>(); final List awaits = player.getQuestsForTalk(getTemplate().npcId); - final Quest[] starts = getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START); + final List 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); } } } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 7dbef90122..20f2561b44 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -1674,16 +1674,12 @@ public class PlayerInstance extends Playable List 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 getAllQuestStates() + { + return _quests.values(); + } + /** * Process quest event. * @param quest the quest diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/SepulcherNpcInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/SepulcherNpcInstance.java index 28bacc9b47..f07b157c15 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/SepulcherNpcInstance.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/SepulcherNpcInstance.java @@ -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 questList = getTemplate().getEventQuests(Quest.QuestEventType.QUEST_TALK); + if (questList.size() == 1) { - qlst[0].notifyFirstTalk(this, player); + questList.get(0).notifyFirstTalk(this, player); } else { diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java index 8acade1f47..7fc19b3c95 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java @@ -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 _skills = new HashMap<>(); private final Map _vulnerabilities = new EnumMap<>(Stats.class); // contains a list of quests for each event type (questStart, questAttack, questKill, etc) - private final Map _questEvents = new EnumMap<>(QuestEventType.class); + private final Map> _questEvents = new EnumMap<>(QuestEventType.class); /** * Constructor of Creature.
@@ -301,24 +302,22 @@ public class NpcTemplate extends CreatureTemplate { if (_questEvents.get(eventType) == null) { - _questEvents.put(eventType, new Quest[] - { - q - }); + final List quests = new ArrayList<>(); + quests.add(q); + _questEvents.put(eventType, quests); } else { - final Quest[] quests = _questEvents.get(eventType); - final int len = quests.length; + final List 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 getEventQuests(Quest.QuestEventType eventType) { if (_questEvents.get(eventType) == null) { - return new Quest[0]; + return Collections.emptyList(); } return _questEvents.get(eventType); } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/QuestList.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/QuestList.java index 7673919572..dba96d56dd 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/QuestList.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/serverpackets/QuestList.java @@ -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 _quests; - private final PlayerInstance _activeChar; + private final Collection _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)