diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java index cca3612..a711d83 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java @@ -3,6 +3,7 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.blackvein.quests.QuestsAPI; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.IStage; +import me.blackvein.quests.quests.Planner; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPCRegistry; import net.knarcraft.dynmapcitizens.DynmapCitizens; @@ -23,6 +24,7 @@ import org.dynmap.markers.Marker; import org.dynmap.markers.MarkerIcon; import org.dynmap.markers.MarkerSet; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -41,6 +43,7 @@ public class QuestsHandler extends AbstractTraitHandler { private Map markerIcons; private Map questGiverInfo; private final QuestsSettings settings = new QuestsSettings(); + private List unavailableQuests; @Override public void initialize() { @@ -108,8 +111,16 @@ public class QuestsHandler extends AbstractTraitHandler { private void generateQuestNPCInfo() { //Clear any previous information questGiverInfo = new HashMap<>(); + unavailableQuests = new ArrayList<>(); //Generation information about NPC's parts in each quest for (IQuest quest : questsAPI.getLoadedQuests()) { + if (isQuestUnavailable(quest)) { + unavailableQuests.add(quest); + //If unavailable quests aren't displayed, there is no point in continuing + if (settings.hideUnavailableQuests()) { + continue; + } + } if (quest.getNpcStart() != null) { getInfo(quest.getNpcStart()).addQuestStart(quest); } @@ -127,6 +138,49 @@ public class QuestsHandler extends AbstractTraitHandler { } } + /** + * Checks whether the given quest is unavailable, according to its planner information + * + * @param quest

The quest to check for availability

+ * @return

True if the quest is unavailable

+ */ + private boolean isQuestUnavailable(IQuest quest) { + Planner planner = quest.getPlanner(); + long currentTime = System.currentTimeMillis(); + + if (!planner.hasEnd() && !planner.hasStart()) { + return false; + } + + if (!planner.hasStart()) { + //If past the end datetime, the quest is no longer available + return currentTime > planner.getEndInMillis(); + } + + if (!planner.hasEnd()) { + //If before the start datetime, the quest is not yet available + return currentTime < planner.getStartInMillis(); + } + + if (!planner.hasRepeat()) { + //If outside the start and end dates, the quest is unavailable + return currentTime < planner.getStartInMillis() || currentTime > planner.getEndInMillis(); + } + + long startTime = planner.getStartInMillis(); + long endTime = planner.getEndInMillis(); + + do { + if (currentTime > startTime && currentTime < endTime) { + return false; + } + startTime += planner.getRepeat(); + endTime += planner.getRepeat(); + //If startTime > currentTime, current time cannot be within the interval + } while (startTime < currentTime); + return true; + } + /** * Generates all quest markers based on the previously generated quest NPC info */ @@ -245,6 +299,10 @@ public class QuestsHandler extends AbstractTraitHandler { this.killAreaMarkerSet.getCircleMarkers().forEach(GenericMarker::deleteMarker); this.reachAreaMarkerSet.getCircleMarkers().forEach(GenericMarker::deleteMarker); for (IQuest quest : questsAPI.getLoadedQuests()) { + //Skip marker if quest is unavailable, and unavailable quests are hidden + if (settings.hideUnavailableQuests() && this.unavailableQuests.contains(quest)) { + continue; + } for (IStage stage : quest.getStages()) { markKillLocations(quest, stage); markReachLocations(quest, stage); diff --git a/src/main/java/net/knarcraft/dynmapcitizens/settings/QuestsSettings.java b/src/main/java/net/knarcraft/dynmapcitizens/settings/QuestsSettings.java index ac279a3..385c695 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/settings/QuestsSettings.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/settings/QuestsSettings.java @@ -11,6 +11,7 @@ public class QuestsSettings extends AbstractTraitSettings { private boolean displayPlannerInfo; private boolean displayStageInfo; private boolean displayRequirementInfo; + private boolean displayUnavailableQuests; private final AreaMarkerSettings killAreaSettings = new AreaMarkerSettings(); private final AreaMarkerSettings reachAreaSettings = new AreaMarkerSettings(); @@ -21,6 +22,7 @@ public class QuestsSettings extends AbstractTraitSettings { this.displayPlannerInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayPlannerInfo", true); this.displayStageInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayStageInfo", true); this.displayRequirementInfo = configuration.getBoolean(getTraitConfigRoot() + ".displayRequirementInfo", true); + this.displayUnavailableQuests = configuration.getBoolean(getTraitConfigRoot() + ".displayUnavailableQuests", true); this.killAreaSettings.load(configuration, getTraitConfigRoot() + ".circleMarker.killMarker"); this.reachAreaSettings.load(configuration, getTraitConfigRoot() + ".circleMarker.reachMarker"); } @@ -66,6 +68,15 @@ public class QuestsSettings extends AbstractTraitSettings { return this.displayRequirementInfo; } + /** + * Gets whether to hide quests which are currently unavailable according to the planner dates + * + * @return

True if unavailable quests should be hidden

+ */ + public boolean hideUnavailableQuests() { + return !this.displayUnavailableQuests; + } + /** * Gets settings for the kill area markers * diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0cad028..08a4b88 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -37,6 +37,8 @@ traits: markerSetName: "Quests" # Whether to hide the quest icon layer by default markersHiddenByDefault: false + # Whether to display information about a quest that's currently outside its availability period + displayUnavailableQuests: true # Whether to add information about a quest's rewards to the marker description displayRewardInfo: true # Whether to add information about a quest's start date, stop date and cool-down to the marker description