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.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.CategoryType; import org.l2jmobius.gameserver.enums.CategoryType;
@@ -813,7 +812,7 @@ public class TvT extends Event
EVENT_ACTIVE = true; EVENT_ACTIVE = true;
// Cancel timers. (In case event started immediately after another event was canceled.) // 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) for (QuestTimer timer : timers)
{ {
@@ -846,7 +845,7 @@ public class TvT extends Event
// Despawn event manager. // Despawn event manager.
MANAGER_NPC_INSTANCE.deleteMe(); MANAGER_NPC_INSTANCE.deleteMe();
// Cancel timers. // Cancel timers.
for (Set<QuestTimer> timers : getQuestTimers().values()) for (List<QuestTimer> timers : getQuestTimers().values())
{ {
for (QuestTimer timer : timers) for (QuestTimer timer : timers)
{ {

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -260,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -283,11 +284,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -306,7 +311,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -334,7 +339,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -364,7 +369,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -375,7 +380,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -392,7 +396,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2812,16 +2816,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -86,7 +87,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -262,7 +263,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -285,11 +286,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -308,7 +313,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -336,7 +341,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -366,7 +371,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -377,7 +382,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -394,7 +398,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2814,16 +2818,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -87,7 +88,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -263,7 +264,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -286,11 +287,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -309,7 +314,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -337,7 +342,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -367,7 +372,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -378,7 +383,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -395,7 +399,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2815,16 +2819,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -88,7 +89,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -263,7 +264,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -286,11 +287,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -309,7 +314,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -337,7 +342,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -367,7 +372,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -378,7 +383,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -395,7 +399,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2815,16 +2819,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -88,7 +89,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -263,7 +264,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -286,11 +287,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -309,7 +314,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -337,7 +342,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -367,7 +372,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -378,7 +383,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -395,7 +399,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2815,16 +2819,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -88,7 +89,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -263,7 +264,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -286,11 +287,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -309,7 +314,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -337,7 +342,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -367,7 +372,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -378,7 +383,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -395,7 +399,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2815,16 +2819,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -88,7 +89,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -263,7 +264,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -286,11 +287,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -309,7 +314,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -337,7 +342,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -367,7 +372,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -378,7 +383,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -395,7 +399,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2815,16 +2819,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -88,7 +89,7 @@ public class Quest extends AbstractScript implements IIdentifiable
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -273,7 +274,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -296,11 +297,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -319,7 +324,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -347,7 +352,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -377,7 +382,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -388,7 +393,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -405,7 +409,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2825,16 +2829,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

@@ -27,8 +27,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -68,7 +67,7 @@ public class Quest extends ManagedScript
/** Map containing events from String value of the event */ /** Map containing events from String value of the event */
private static Map<String, Quest> _allEvents = new HashMap<>(); private static Map<String, Quest> _allEvents = new HashMap<>();
/** Map containing lists of timers from the name of the timer */ /** 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<>();
private final int _questId; private final int _questId;
private final String _prefixPath; // used only for admin_quest_reload private final String _prefixPath; // used only for admin_quest_reload
@@ -334,7 +333,7 @@ public class Quest extends ManagedScript
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -357,11 +356,15 @@ public class Quest extends ManagedScript
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -380,7 +383,7 @@ public class Quest extends ManagedScript
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -408,7 +411,7 @@ public class Quest extends ManagedScript
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -438,7 +441,7 @@ public class Quest extends ManagedScript
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -449,7 +452,6 @@ public class Quest extends ManagedScript
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -466,7 +468,7 @@ public class Quest extends ManagedScript
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -1660,16 +1662,14 @@ public class Quest extends ManagedScript
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
return QuestManager.getInstance().removeQuest(this); return QuestManager.getInstance().removeQuest(this);

View File

@@ -17,6 +17,7 @@
package handlers.admincommandhandlers; package handlers.admincommandhandlers;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.TreeSet; import java.util.TreeSet;
@@ -237,7 +238,7 @@ public class AdminQuest implements IAdminCommandHandler
items = quest.getRegisteredItemIds().length + ":" + items.substring(2); 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) for (QuestTimer timer : list)
{ {

View File

@@ -27,8 +27,7 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@@ -74,7 +73,7 @@ import org.l2jmobius.gameserver.util.Util;
public class Quest extends AbstractScript implements IIdentifiable public class Quest extends AbstractScript implements IIdentifiable
{ {
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Map<Predicate<PlayerInstance>, String> _startCondition = new LinkedHashMap<>(1); private final Map<Predicate<PlayerInstance>, String> _startCondition = new LinkedHashMap<>(1);
@@ -237,7 +236,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -260,11 +259,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -283,7 +286,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -311,7 +314,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -341,7 +344,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -352,7 +355,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -369,7 +371,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2504,16 +2506,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

@@ -17,6 +17,7 @@
package handlers.admincommandhandlers; package handlers.admincommandhandlers;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.TreeSet; import java.util.TreeSet;
@@ -237,7 +238,7 @@ public class AdminQuest implements IAdminCommandHandler
items = quest.getRegisteredItemIds().length + ":" + items.substring(2); 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) for (QuestTimer timer : list)
{ {

View File

@@ -27,8 +27,7 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@@ -76,7 +75,7 @@ import org.l2jmobius.gameserver.util.Util;
public class Quest extends AbstractScript implements IIdentifiable public class Quest extends AbstractScript implements IIdentifiable
{ {
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Map<Predicate<PlayerInstance>, String> _startCondition = new LinkedHashMap<>(1); private final Map<Predicate<PlayerInstance>, String> _startCondition = new LinkedHashMap<>(1);
@@ -239,7 +238,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -262,11 +261,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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));
} }
} }
} }
@@ -285,7 +288,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return null; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -313,7 +316,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -343,7 +346,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -354,7 +357,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -371,7 +373,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2547,16 +2549,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)

View File

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

View File

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

View File

@@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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()); public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
/** Map containing lists of timers from the name of the timer. */ /** 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. */ /** Map containing all the start conditions. */
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1); private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
@@ -261,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
* Gets the quest timers. * Gets the quest timers.
* @return the quest timers * @return the quest timers
*/ */
public Map<String, Set<QuestTimer>> getQuestTimers() public Map<String, List<QuestTimer>> getQuestTimers()
{ {
return _questTimers; return _questTimers;
} }
@@ -284,11 +285,15 @@ public class Quest extends AbstractScript implements IIdentifiable
synchronized (_questTimers) 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 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) 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; return null;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return null; return null;
@@ -335,7 +340,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -365,7 +370,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(name); final List<QuestTimer> timers = _questTimers.get(name);
if ((timers == null) || timers.isEmpty()) if ((timers == null) || timers.isEmpty())
{ {
return; return;
@@ -376,7 +381,6 @@ public class Quest extends AbstractScript implements IIdentifiable
if ((timer != null) && timer.equals(this, name, npc, player)) if ((timer != null) && timer.equals(this, name, npc, player))
{ {
timer.cancel(); timer.cancel();
return;
} }
} }
} }
@@ -393,7 +397,7 @@ public class Quest extends AbstractScript implements IIdentifiable
return; return;
} }
final Set<QuestTimer> timers = _questTimers.get(timer.toString()); final List<QuestTimer> timers = _questTimers.get(timer.toString());
if (timers != null) if (timers != null)
{ {
timers.remove(timer); timers.remove(timer);
@@ -2769,16 +2773,14 @@ public class Quest extends AbstractScript implements IIdentifiable
// Cancel all pending timers before reloading. // 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). // 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) for (QuestTimer timer : timers)
{ {
timer.cancel(); timer.cancel();
} }
timers.clear(); timers.clear();
} }
_questTimers.clear(); _questTimers.clear();
if (removeFromList) if (removeFromList)