Use Set for quest timers and initialize conditions.
This commit is contained in:
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -812,7 +813,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -845,7 +846,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -261,7 +260,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -277,9 +276,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -302,7 +306,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -330,7 +334,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -360,7 +364,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -388,7 +392,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2808,7 +2812,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2888,16 +2892,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2908,11 +2902,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2932,7 +2921,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2944,6 +2933,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -812,7 +813,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -845,7 +846,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -87,9 +86,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -263,7 +262,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -279,9 +278,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -304,7 +308,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -332,7 +336,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -362,7 +366,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -390,7 +394,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2810,7 +2814,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2890,16 +2894,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2910,11 +2904,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2934,7 +2923,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2946,6 +2935,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -812,7 +813,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -845,7 +846,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -88,9 +87,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -264,7 +263,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -280,9 +279,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -305,7 +309,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -333,7 +337,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -363,7 +367,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -391,7 +395,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2811,7 +2815,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2891,16 +2895,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2911,11 +2905,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2935,7 +2924,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2947,6 +2936,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -812,7 +813,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -845,7 +846,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -89,9 +88,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -264,7 +263,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -280,9 +279,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -305,7 +309,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -333,7 +337,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -363,7 +367,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -391,7 +395,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2811,7 +2815,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2891,16 +2895,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2911,11 +2905,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2935,7 +2924,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2947,6 +2936,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -810,7 +811,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -843,7 +844,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -89,9 +88,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -264,7 +263,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -280,9 +279,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -305,7 +309,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -333,7 +337,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -363,7 +367,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -391,7 +395,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2811,7 +2815,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2891,16 +2895,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2911,11 +2905,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2935,7 +2924,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2947,6 +2936,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -810,7 +811,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -843,7 +844,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -89,9 +88,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -264,7 +263,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -280,9 +279,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -305,7 +309,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -333,7 +337,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -363,7 +367,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -391,7 +395,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2811,7 +2815,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2891,16 +2895,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2911,11 +2905,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2935,7 +2924,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2947,6 +2936,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -810,7 +811,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -843,7 +844,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -89,9 +88,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -264,7 +263,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -280,9 +279,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -305,7 +309,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -333,7 +337,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -363,7 +367,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -391,7 +395,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2811,7 +2815,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2891,16 +2895,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2911,11 +2905,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2935,7 +2924,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2947,6 +2936,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
@@ -810,7 +811,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -843,7 +844,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -89,9 +88,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -274,7 +273,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -290,9 +289,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -315,7 +319,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -343,7 +347,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -373,7 +377,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -401,7 +405,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2821,7 +2825,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2901,16 +2905,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2921,11 +2915,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2945,7 +2934,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2957,6 +2946,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -27,7 +27,8 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -67,7 +68,7 @@ public class Quest extends ManagedScript
|
||||
/** Map containing events from String value of the event */
|
||||
private static Map<String, Quest> _allEvents = new HashMap<>();
|
||||
/** Map containing lists of timers from the name of the timer */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
|
||||
private final int _questId;
|
||||
private final String _prefixPath; // used only for admin_quest_reload
|
||||
@@ -333,7 +334,7 @@ public class Quest extends ManagedScript
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -349,9 +350,14 @@ public class Quest extends ManagedScript
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, NpcInstance npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -374,7 +380,7 @@ public class Quest extends ManagedScript
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -402,7 +408,7 @@ public class Quest extends ManagedScript
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -432,7 +438,7 @@ public class Quest extends ManagedScript
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -460,7 +466,7 @@ public class Quest extends ManagedScript
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -472,7 +478,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyAttack(NpcInstance npc, PlayerInstance attacker, int damage, boolean isPet)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onAttack(npc, attacker, damage, isPet);
|
||||
@@ -487,7 +492,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyDeath(Creature killer, Creature victim, QuestState qs)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onDeath(killer, victim, qs);
|
||||
@@ -502,7 +506,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyEvent(String event, NpcInstance npc, PlayerInstance player)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onAdvEvent(event, npc, player);
|
||||
@@ -517,7 +520,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyKill(NpcInstance npc, PlayerInstance killer, boolean isPet)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onKill(npc, killer, isPet);
|
||||
@@ -532,7 +534,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyTalk(NpcInstance npc, QuestState qs)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onTalk(npc, qs.getPlayer());
|
||||
@@ -551,7 +552,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyFirstTalk(NpcInstance npc, PlayerInstance player)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onFirstTalk(npc, player);
|
||||
@@ -577,7 +577,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifySkillUse(NpcInstance npc, PlayerInstance caster, Skill skill)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onSkillUse(npc, caster, skill);
|
||||
@@ -620,7 +619,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifyAggroRangeEnter(NpcInstance npc, PlayerInstance player, boolean isPet)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onAggroRangeEnter(npc, player, isPet);
|
||||
@@ -635,7 +633,6 @@ public class Quest extends ManagedScript
|
||||
public boolean notifySpawn(NpcInstance npc)
|
||||
{
|
||||
String res = null;
|
||||
|
||||
try
|
||||
{
|
||||
res = onSpawn(npc);
|
||||
@@ -1663,7 +1660,7 @@ public class Quest extends ManagedScript
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -17,7 +17,6 @@
|
||||
package handlers.admincommandhandlers;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -238,7 +237,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -27,7 +27,8 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
|
||||
@@ -73,9 +74,9 @@ import org.l2jmobius.gameserver.util.Util;
|
||||
public class Quest extends AbstractScript implements IIdentifiable
|
||||
{
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Map<Predicate<PlayerInstance>, String> _startCondition = null;
|
||||
private final Map<Predicate<PlayerInstance>, String> _startCondition = new LinkedHashMap<>(1);
|
||||
|
||||
private final int _questId;
|
||||
protected boolean _onEnterWorld = false;
|
||||
@@ -236,7 +237,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -252,9 +253,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -277,7 +283,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -305,7 +311,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -335,7 +341,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -363,7 +369,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2498,7 +2504,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2554,13 +2560,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Map<Predicate<PlayerInstance>, String> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
_startCondition = new LinkedHashMap<>(1);
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2571,11 +2570,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (Predicate<PlayerInstance> cond : _startCondition.keySet())
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2593,11 +2587,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public String getStartConditionHtml(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
for (Entry<Predicate<PlayerInstance>, String> startRequirement : _startCondition.entrySet())
|
||||
{
|
||||
if (!startRequirement.getKey().test(player))
|
||||
|
@@ -17,7 +17,6 @@
|
||||
package handlers.admincommandhandlers;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -238,7 +237,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -27,7 +27,8 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
|
||||
@@ -75,9 +76,9 @@ import org.l2jmobius.gameserver.util.Util;
|
||||
public class Quest extends AbstractScript implements IIdentifiable
|
||||
{
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Map<Predicate<PlayerInstance>, String> _startCondition = null;
|
||||
private final Map<Predicate<PlayerInstance>, String> _startCondition = new LinkedHashMap<>(1);
|
||||
|
||||
private final int _questId;
|
||||
protected boolean _onEnterWorld = false;
|
||||
@@ -238,7 +239,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -254,9 +255,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -279,7 +285,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -307,7 +313,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -337,7 +343,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -365,7 +371,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2541,7 +2547,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2597,13 +2603,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Map<Predicate<PlayerInstance>, String> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
_startCondition = new LinkedHashMap<>(1);
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2614,11 +2613,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (Predicate<PlayerInstance> cond : _startCondition.keySet())
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2636,11 +2630,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public String getStartConditionHtml(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
for (Entry<Predicate<PlayerInstance>, String> startRequirement : _startCondition.entrySet())
|
||||
{
|
||||
if (!startRequirement.getKey().test(player))
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.PartyDistributionType;
|
||||
@@ -814,7 +815,7 @@ public class TvT extends Event
|
||||
EVENT_ACTIVE = true;
|
||||
|
||||
// Cancel timers. (In case event started immediately after another event was canceled.)
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ public class TvT extends Event
|
||||
// Despawn event manager.
|
||||
MANAGER_NPC_INSTANCE.deleteMe();
|
||||
// Cancel timers.
|
||||
for (List<QuestTimer> timers : getQuestTimers().values())
|
||||
for (Set<QuestTimer> timers : getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
|
@@ -19,7 +19,6 @@ package handlers.admincommandhandlers;
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
@@ -253,7 +252,7 @@ public class AdminQuest implements IAdminCommandHandler
|
||||
items = quest.getRegisteredItemIds().length + ":" + items.substring(2);
|
||||
}
|
||||
|
||||
for (List<QuestTimer> list : quest.getQuestTimers().values())
|
||||
for (Set<QuestTimer> list : quest.getQuestTimers().values())
|
||||
{
|
||||
for (QuestTimer timer : list)
|
||||
{
|
||||
|
@@ -28,7 +28,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@@ -86,9 +85,9 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public static final Logger LOGGER = Logger.getLogger(Quest.class.getName());
|
||||
|
||||
/** Map containing lists of timers from the name of the timer. */
|
||||
private final Map<String, List<QuestTimer>> _questTimers = new HashMap<>();
|
||||
private final Map<String, Set<QuestTimer>> _questTimers = new HashMap<>();
|
||||
/** Map containing all the start conditions. */
|
||||
private Set<QuestCondition> _startCondition = null;
|
||||
private final Set<QuestCondition> _startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
|
||||
private final int _questId;
|
||||
private final byte _initialState = State.CREATED;
|
||||
@@ -262,7 +261,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
* Gets the quest timers.
|
||||
* @return the quest timers
|
||||
*/
|
||||
public Map<String, List<QuestTimer>> getQuestTimers()
|
||||
public Map<String, Set<QuestTimer>> getQuestTimers()
|
||||
{
|
||||
return _questTimers;
|
||||
}
|
||||
@@ -278,9 +277,14 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (_questTimers)
|
||||
{
|
||||
final List<QuestTimer> timers = _questTimers.computeIfAbsent(name, k -> new CopyOnWriteArrayList<>());
|
||||
final Set<QuestTimer> timers = _questTimers.getOrDefault(name, ConcurrentHashMap.newKeySet(1));
|
||||
// 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)
|
||||
{
|
||||
@@ -303,7 +307,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return null;
|
||||
@@ -331,7 +335,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -361,7 +365,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(name);
|
||||
final Set<QuestTimer> timers = _questTimers.get(name);
|
||||
if ((timers == null) || timers.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -389,7 +393,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return;
|
||||
}
|
||||
|
||||
final List<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
final Set<QuestTimer> timers = _questTimers.get(timer.toString());
|
||||
if (timers != null)
|
||||
{
|
||||
timers.remove(timer);
|
||||
@@ -2765,7 +2769,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
|
||||
// Cancel all pending timers before reloading.
|
||||
// If timers ought to be restarted, the quest can take care of it with its code (example: save global data indicating what timer must be restarted).
|
||||
for (List<QuestTimer> timers : _questTimers.values())
|
||||
for (Set<QuestTimer> timers : _questTimers.values())
|
||||
{
|
||||
for (QuestTimer timer : timers)
|
||||
{
|
||||
@@ -2845,16 +2849,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
private Set<QuestCondition> getStartConditions()
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
_startCondition = ConcurrentHashMap.newKeySet(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _startCondition;
|
||||
}
|
||||
|
||||
@@ -2865,11 +2859,6 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
*/
|
||||
public boolean canStartQuest(PlayerInstance player)
|
||||
{
|
||||
if (_startCondition == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (QuestCondition cond : _startCondition)
|
||||
{
|
||||
if (!cond.test(player))
|
||||
@@ -2889,7 +2878,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public String getStartConditionHtml(PlayerInstance player, Npc npc)
|
||||
{
|
||||
final QuestState qs = getQuestState(player, false);
|
||||
if ((_startCondition == null) || ((qs != null) && !qs.isCreated()))
|
||||
if ((qs != null) && !qs.isCreated())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -2901,6 +2890,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
return cond.getHtml(npc);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user