Load quests async on startup

This commit is contained in:
P0nk
2021-04-12 22:05:57 +02:00
parent a59b55db57
commit 055ee01ae9
2 changed files with 36 additions and 46 deletions

View File

@@ -856,15 +856,11 @@ public class Server {
final List<Future<?>> futures = new ArrayList<>(); final List<Future<?>> futures = new ArrayList<>();
futures.add(initExecutor.submit(() -> SkillFactory.loadAllSkills())); futures.add(initExecutor.submit(() -> SkillFactory.loadAllSkills()));
futures.add(initExecutor.submit(() -> CashItemFactory.loadAllCashItems())); futures.add(initExecutor.submit(() -> CashItemFactory.loadAllCashItems()));
futures.add(initExecutor.submit(() -> MapleQuest.loadAllQuests()));
ThreadManager.getInstance().start(); ThreadManager.getInstance().start();
initializeTimelyTasks(); // aggregated method for timely tasks thanks to lxconan initializeTimelyTasks(); // aggregated method for timely tasks thanks to lxconan
long timeToTake = System.currentTimeMillis();
MapleQuest.loadAllQuest();
final double questLoadTime = (System.currentTimeMillis() - timeToTake) / 1000.0;
log.info("Quest loaded in {} seconds", questLoadTime);
NewYearCardRecord.startPendingNewYearCardRequests(); NewYearCardRecord.startPendingNewYearCardRequests();
if (YamlConfig.config.server.USE_THREAD_TRACKER) { if (YamlConfig.config.server.USE_THREAD_TRACKER) {
@@ -888,7 +884,7 @@ public class Server {
} }
if (YamlConfig.config.server.USE_FAMILY_SYSTEM) { if (YamlConfig.config.server.USE_FAMILY_SYSTEM) {
timeToTake = System.currentTimeMillis(); long timeToTake = System.currentTimeMillis();
MapleFamily.loadAllFamilies(); MapleFamily.loadAllFamilies();
final double familyLoadTime = (System.currentTimeMillis() - timeToTake) / 1000.0; final double familyLoadTime = (System.currentTimeMillis() - timeToTake) / 1000.0;
log.info("Families loaded in {} seconds", familyLoadTime); log.info("Families loaded in {} seconds", familyLoadTime);

View File

@@ -21,20 +21,10 @@
*/ */
package server.quest; package server.quest;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import client.MapleCharacter; import client.MapleCharacter;
import client.MapleQuestStatus; import client.MapleQuestStatus;
import client.MapleQuestStatus.Status; import client.MapleQuestStatus.Status;
import config.YamlConfig; import config.YamlConfig;
import java.util.Collection;
import java.util.EnumMap;
import java.util.Map.Entry;
import java.util.Set;
import provider.MapleData; import provider.MapleData;
import provider.MapleDataProvider; import provider.MapleDataProvider;
import provider.MapleDataProviderFactory; import provider.MapleDataProviderFactory;
@@ -44,6 +34,10 @@ import server.quest.requirements.*;
import tools.MaplePacketCreator; import tools.MaplePacketCreator;
import tools.StringUtil; import tools.StringUtil;
import java.io.File;
import java.util.*;
import java.util.Map.Entry;
/** /**
* *
* @author Matze * @author Matze
@@ -51,8 +45,8 @@ import tools.StringUtil;
*/ */
public class MapleQuest { public class MapleQuest {
private static Map<Integer, MapleQuest> quests = new HashMap<>(); private static volatile Map<Integer, MapleQuest> quests = new HashMap<>();
private static Map<Integer, Integer> infoNumberQuests = new HashMap<>(); private static volatile Map<Integer, Integer> infoNumberQuests = new HashMap<>();
private static Map<Short, Integer> medals = new HashMap<>(); private static Map<Short, Integer> medals = new HashMap<>();
private static final Set<Short> exploitableQuests = new HashSet<>(); private static final Set<Short> exploitableQuests = new HashSet<>();
@@ -459,10 +453,8 @@ public class MapleQuest {
} }
public static void clearCache(int quest) { public static void clearCache(int quest) {
if(quests.containsKey(quest)){
quests.remove(quest); quests.remove(quest);
} }
}
public static void clearCache() { public static void clearCache() {
quests.clear(); quests.clear();
@@ -657,28 +649,30 @@ public class MapleQuest {
return ret; return ret;
} }
public static void loadAllQuest() { public static void loadAllQuests() {
try { final Map<Integer, MapleQuest> loadedQuests = new HashMap<>();
for(MapleData quest : questInfo.getChildren()) { final Map<Integer, Integer> loadedInfoNumberQuests = new HashMap<>();
for (MapleData quest : questInfo.getChildren()) {
int questID = Integer.parseInt(quest.getName()); int questID = Integer.parseInt(quest.getName());
MapleQuest q = new MapleQuest(questID); MapleQuest q = new MapleQuest(questID);
quests.put(questID, q); loadedQuests.put(questID, q);
int infoNumber; int infoNumber;
infoNumber = q.getInfoNumber(Status.STARTED); infoNumber = q.getInfoNumber(Status.STARTED);
if (infoNumber > 0) { if (infoNumber > 0) {
infoNumberQuests.put(infoNumber, questID); loadedInfoNumberQuests.put(infoNumber, questID);
} }
infoNumber = q.getInfoNumber(Status.COMPLETED); infoNumber = q.getInfoNumber(Status.COMPLETED);
if (infoNumber > 0) { if (infoNumber > 0) {
infoNumberQuests.put(infoNumber, questID); loadedInfoNumberQuests.put(infoNumber, questID);
} }
} }
} catch (Exception ex) {
ex.printStackTrace(); MapleQuest.quests = loadedQuests;
} MapleQuest.infoNumberQuests = loadedInfoNumberQuests;
} }
} }