Reintroduction of CopyOnWriteArrayList for storing QuestTimers.

This commit is contained in:
MobiusDevelopment
2020-05-17 02:49:50 +00:00
parent e23fb9f6e6
commit 1464b1ab8b
50 changed files with 316 additions and 284 deletions

View File

@@ -20,7 +20,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PartyDistributionType;
@@ -815,7 +814,7 @@ public class TvT extends Event
EVENT_ACTIVE = true;
// Cancel timers. (In case event started immediately after another event was canceled.)
for (Set<QuestTimer> timers : getQuestTimers().values())
for (List<QuestTimer> timers : getQuestTimers().values())
{
for (QuestTimer timer : timers)
{
@@ -848,7 +847,7 @@ public class TvT extends Event
// Despawn event manager.
MANAGER_NPC_INSTANCE.deleteMe();
// Cancel timers.
for (Set<QuestTimer> timers : getQuestTimers().values())
for (List<QuestTimer> timers : getQuestTimers().values())
{
for (QuestTimer timer : timers)
{

View File

@@ -19,6 +19,7 @@ package handlers.admincommandhandlers;
import java.io.File;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
@@ -252,7 +253,7 @@ public class AdminQuest implements IAdminCommandHandler
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
}
for (Set<QuestTimer> list : quest.getQuestTimers().values())
for (List<QuestTimer> list : quest.getQuestTimers().values())
{
for (QuestTimer timer : list)
{

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -85,7 +86,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
/** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers.
* @return the quest timers
*/
public Map<String, Set<QuestTimer>> getQuestTimers()
public Map<String, List<QuestTimer>> getQuestTimers()
{
return _questTimers;
}
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers)
{
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
if (!_questTimers.containsKey(name))
{
_questTimers.put(name, new CopyOnWriteArrayList<>());
}
// If there exists a timer with this name, allow the timer only if the [npc, player] set is unique nulls act as wildcards.
if (getQuestTimer(name, npc, player) == null)
{
timers.add(new QuestTimer(this, name, time, npc, player, repeating));
_questTimers.get(name).add(new QuestTimer(this, name, time, npc, player, repeating));
}
}
}
@@ -307,7 +312,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null;
}
final Set<QuestTimer> timers = _questTimers.get(name);
final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty())
{
return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return;
}
final Set<QuestTimer> timers = _questTimers.get(name);
final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty())
{
return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return;
}
final Set<QuestTimer> timers = _questTimers.get(name);
final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty())
{
return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player))
{
timer.cancel();
return;
}
}
}
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return;
}
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null)
{
timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading.
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
for (Set<QuestTimer> timers : _questTimers.values())
for (List<QuestTimer> timers : _questTimers.values())
{
for (QuestTimer timer : timers)
{
timer.cancel();
}
timers.clear();
}
_questTimers.clear();
if (removeFromList)