diff options
Diffstat (limited to 'common/src/main/java')
9 files changed, 264 insertions, 69 deletions
diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java index 7cadaa9a..04597b6e 100644 --- a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.common.player.questprogressfile; import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.filters.QuestProgressFilter; import com.leonardobishop.quests.common.plugin.Quests; import com.leonardobishop.quests.common.quest.Quest; import com.leonardobishop.quests.common.quest.Task; @@ -77,17 +78,16 @@ public final class QuestProgressFile { */ @Contract(pure = true) public @NotNull List<Quest> getStartedQuests() { - return this.getAllQuestsFromProgress(QuestsProgressFilter.STARTED); + return this.getAllQuestsFromProgress(QuestProgressFilter.STARTED); } /** - * Returns all {@link Quest} a player has encountered - * (not to be confused with a collection of quest progress) + * Returns all {@link Quest} a player has encountered (not to be confused with a collection of quest progress). * - * @return {@code List<Quest>} all quests + * @return list of matching quests */ @Contract(pure = true) - public @NotNull List<Quest> getAllQuestsFromProgress(final @NotNull QuestsProgressFilter filter) { + public @NotNull List<Quest> getAllQuestsFromProgress(final @NotNull QuestProgressFilter filter) { final List<Quest> quests = new ArrayList<>(); for (final QuestProgress questProgress : this.questProgressMap.values()) { @@ -107,66 +107,32 @@ public final class QuestProgressFile { return quests; } - public enum QuestsProgressFilter { - ALL("all") { - @Override - @Contract(pure = true) - public boolean matches(final @NotNull QuestProgress questProgress) { - return true; - } - }, - COMPLETED("completed") { - @Override - @Contract(pure = true) - public boolean matches(final @NotNull QuestProgress questProgress) { - return questProgress.isCompleted(); - } - }, - COMPLETED_BEFORE("completedBefore") { - @Override - @Contract(pure = true) - public boolean matches(final @NotNull QuestProgress questProgress) { - return questProgress.isCompletedBefore(); - } - }, - STARTED("started") { - @Override - @Contract(pure = true) - public boolean matches(final @NotNull QuestProgress questProgress) { - return questProgress.isStarted(); - } - }; - - private final String legacy; - - QuestsProgressFilter(final @NotNull String legacy) { - this.legacy = legacy; - } - - @SuppressWarnings("unused") - @Contract(pure = true) - public @NotNull String getLegacy() { - return this.legacy; - } - - @Contract(pure = true) - public abstract boolean matches(final @NotNull QuestProgress questProgress); - - // And some static things to improve legacy performance (is it even used?) + /** + * Returns count of all {@link Quest} a player has encountered. It is clearly equivalent to collection size of + * {@link QuestProgressFile#getAllQuestsFromProgress(QuestProgressFilter)}, however it does not utilise a list + * for counting quests so its performance is undeniably better. + * + * @return count of matching quests + */ + @Contract(pure = true) + public int getAllQuestsFromProgressCount(final @NotNull QuestProgressFilter filter) { + int count = 0; - private static final QuestsProgressFilter[] FILTERS = QuestsProgressFilter.values(); + for (final QuestProgress questProgress : this.questProgressMap.values()) { + final boolean matches = filter.matches(questProgress); + if (!matches) { + continue; + } - private static final Map<String, QuestsProgressFilter> legacyToFilterMap = new HashMap<>(QuestsProgressFilter.FILTERS.length) {{ - for (final QuestsProgressFilter questsProgressFilter : QuestsProgressFilter.FILTERS) { - this.put(questsProgressFilter.legacy, questsProgressFilter); + final Quest quest = this.plugin.getQuestManager().getQuestById(questProgress.getQuestId()); + if (quest == null) { + continue; } - }}; - @SuppressWarnings("unused") - @Contract(pure = true) - public static @NotNull QuestsProgressFilter fromLegacy(final @NotNull String legacy) { - return QuestsProgressFilter.legacyToFilterMap.getOrDefault(legacy, QuestsProgressFilter.ALL); + count++; } + + return count; } /** @@ -294,6 +260,11 @@ public final class QuestProgressFile { * @return {@link QuestProgress} or a blank generated one if the quest does not exist */ public @NotNull QuestProgress getQuestProgress(final @NotNull Quest quest) { + if (!this.plugin.isPrimaryThread()) { + //noinspection CallToPrintStackTrace + new IllegalStateException("async getQuestProgress call").printStackTrace(); + } + final QuestProgress questProgress = this.getQuestProgressOrNull(quest); return questProgress != null ? questProgress : this.generateBlankQuestProgress(quest); } @@ -422,21 +393,113 @@ public final class QuestProgressFile { } /** - * It's equivalent to {@code QuestProgressFile#setModified(false)}. - * - * @see QuestProgressFile#setModified(boolean) + * @param modified whether the object has been modified and needs to be saved */ - @Deprecated(forRemoval = true) - public void resetModified() { - this.setModified(false); + public void setModified(final boolean modified) { + for (final QuestProgress questProgress : this.questProgressMap.values()) { + questProgress.setModified(modified); + } } + // DEPRECATED AND FOR REMOVAL + /** - * @param modified whether the object has been modified and needs to be saved + * Returns all {@link Quest} a player has encountered (not to be confused with a collection of quest progress). + * + * @return list of matching quests */ - public void setModified(final boolean modified) { + @Deprecated(forRemoval = true) + @Contract(pure = true) + public @NotNull List<Quest> getAllQuestsFromProgress(final @NotNull QuestsProgressFilter filter) { + final List<Quest> quests = new ArrayList<>(); + for (final QuestProgress questProgress : this.questProgressMap.values()) { - questProgress.setModified(modified); + final boolean matches = filter.matches(questProgress); + if (!matches) { + continue; + } + + final Quest quest = this.plugin.getQuestManager().getQuestById(questProgress.getQuestId()); + if (quest == null) { + continue; + } + + quests.add(quest); } + + return quests; + } + + @Deprecated(forRemoval = true) + public enum QuestsProgressFilter { + ALL("all") { + @Override + @Contract(pure = true) + public boolean matches(final @NotNull QuestProgress questProgress) { + return QuestProgressFilter.ALL.matches(questProgress); + } + }, + COMPLETED("completed") { + @Override + @Contract(pure = true) + public boolean matches(final @NotNull QuestProgress questProgress) { + return QuestProgressFilter.COMPLETED.matches(questProgress); + } + }, + COMPLETED_BEFORE("completedBefore") { + @Override + @Contract(pure = true) + public boolean matches(final @NotNull QuestProgress questProgress) { + return QuestProgressFilter.COMPLETED_BEFORE.matches(questProgress); + } + }, + STARTED("started") { + @Override + @Contract(pure = true) + public boolean matches(final @NotNull QuestProgress questProgress) { + return QuestProgressFilter.STARTED.matches(questProgress); + } + }; + + private final String legacy; + + QuestsProgressFilter(final @NotNull String legacy) { + this.legacy = legacy; + } + + @SuppressWarnings("unused") + @Contract(pure = true) + public @NotNull String getLegacy() { + return this.legacy; + } + + @Contract(pure = true) + public abstract boolean matches(final @NotNull QuestProgress questProgress); + + // And some static things to improve legacy performance (is it even used?) + + private static final QuestsProgressFilter[] FILTERS = QuestsProgressFilter.values(); + + private static final Map<String, QuestsProgressFilter> legacyToFilterMap = new HashMap<>(QuestsProgressFilter.FILTERS.length) {{ + for (final QuestsProgressFilter questsProgressFilter : QuestsProgressFilter.FILTERS) { + this.put(questsProgressFilter.legacy, questsProgressFilter); + } + }}; + + @SuppressWarnings("unused") + @Contract(pure = true) + public static @NotNull QuestsProgressFilter fromLegacy(final @NotNull String legacy) { + return QuestsProgressFilter.legacyToFilterMap.getOrDefault(legacy, QuestsProgressFilter.ALL); + } + } + + /** + * It's equivalent to {@code QuestProgressFile#setModified(false)}. + * + * @see QuestProgressFile#setModified(boolean) + */ + @Deprecated(forRemoval = true) + public void resetModified() { + this.setModified(false); } } diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/AllQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/AllQuestProgressFilter.java new file mode 100644 index 00000000..0e85d33e --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/AllQuestProgressFilter.java @@ -0,0 +1,15 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.NotNull; + +public final class AllQuestProgressFilter implements QuestProgressFilter { + + AllQuestProgressFilter() { + } + + @Override + public boolean matches(final @NotNull QuestProgress questProgress) { + return true; + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ArrayQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ArrayQuestProgressFilter.java new file mode 100644 index 00000000..ee565949 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ArrayQuestProgressFilter.java @@ -0,0 +1,12 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import org.jetbrains.annotations.NotNull; + +public abstract class ArrayQuestProgressFilter implements QuestProgressFilter { + + protected final QuestProgressFilter[] filters; + + ArrayQuestProgressFilter(final @NotNull QuestProgressFilter @NotNull ... filters) { + this.filters = filters; + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedBeforeQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedBeforeQuestProgressFilter.java new file mode 100644 index 00000000..6383b9c4 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedBeforeQuestProgressFilter.java @@ -0,0 +1,15 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.NotNull; + +public final class CompletedBeforeQuestProgressFilter implements QuestProgressFilter { + + CompletedBeforeQuestProgressFilter() { + } + + @Override + public boolean matches(final @NotNull QuestProgress questProgress) { + return questProgress.isCompletedBefore(); + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedQuestProgressFilter.java new file mode 100644 index 00000000..6287440f --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedQuestProgressFilter.java @@ -0,0 +1,15 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.NotNull; + +public final class CompletedQuestProgressFilter implements QuestProgressFilter { + + CompletedQuestProgressFilter() { + } + + @Override + public boolean matches(final @NotNull QuestProgress questProgress) { + return questProgress.isCompleted(); + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ConjunctionQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ConjunctionQuestProgressFilter.java new file mode 100644 index 00000000..c2e904c7 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ConjunctionQuestProgressFilter.java @@ -0,0 +1,22 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.NotNull; + +public final class ConjunctionQuestProgressFilter extends ArrayQuestProgressFilter { + + ConjunctionQuestProgressFilter(final @NotNull QuestProgressFilter @NotNull ... filters) { + super(filters); + } + + @Override + public boolean matches(final @NotNull QuestProgress questProgress) { + for (final QuestProgressFilter filter : this.filters) { + if (!filter.matches(questProgress)) { + return false; + } + } + + return true; + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/DisjunctionQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/DisjunctionQuestProgressFilter.java new file mode 100644 index 00000000..2dd68540 --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/DisjunctionQuestProgressFilter.java @@ -0,0 +1,22 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.NotNull; + +public final class DisjunctionQuestProgressFilter extends ArrayQuestProgressFilter { + + DisjunctionQuestProgressFilter(final @NotNull QuestProgressFilter @NotNull ... filters) { + super(filters); + } + + @Override + public boolean matches(final @NotNull QuestProgress questProgress) { + for (final QuestProgressFilter filter : this.filters) { + if (filter.matches(questProgress)) { + return true; + } + } + + return false; + } +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/QuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/QuestProgressFilter.java new file mode 100644 index 00000000..fad751ff --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/QuestProgressFilter.java @@ -0,0 +1,16 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +public interface QuestProgressFilter { + + QuestProgressFilter ALL = new AllQuestProgressFilter(); + QuestProgressFilter COMPLETED = new CompletedQuestProgressFilter(); + QuestProgressFilter COMPLETED_BEFORE = new CompletedBeforeQuestProgressFilter(); + QuestProgressFilter STARTED = new StartedQuestProgressFilter(); + + @Contract(pure = true) + boolean matches(final @NotNull QuestProgress questProgress); +} diff --git a/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/StartedQuestProgressFilter.java b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/StartedQuestProgressFilter.java new file mode 100644 index 00000000..2a48f9fa --- /dev/null +++ b/common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/StartedQuestProgressFilter.java @@ -0,0 +1,15 @@ +package com.leonardobishop.quests.common.player.questprogressfile.filters; + +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; +import org.jetbrains.annotations.NotNull; + +public final class StartedQuestProgressFilter implements QuestProgressFilter { + + StartedQuestProgressFilter() { + } + + @Override + public boolean matches(final @NotNull QuestProgress questProgress) { + return questProgress.isStarted(); + } +} |
