aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrakenied <krakenied1@gmail.com>2025-02-02 19:05:32 +0100
committerKrakenied <46192742+Krakenied@users.noreply.github.com>2025-05-13 20:34:15 +0200
commit3965b739b37597b7146d772c6549db300d18687a (patch)
treef942448ed14378d23dae556b2cf0927c2f650322
parent6dd53a342c9c1794bbbf40b317678b4fe4179454 (diff)
Better quest progress filter implementation
To be used in QuestsPlaceholders rewrite
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java201
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/AllQuestProgressFilter.java15
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ArrayQuestProgressFilter.java12
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedBeforeQuestProgressFilter.java15
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/CompletedQuestProgressFilter.java15
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/ConjunctionQuestProgressFilter.java22
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/DisjunctionQuestProgressFilter.java22
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/QuestProgressFilter.java16
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/StartedQuestProgressFilter.java15
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();
+ }
+}