aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java10
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java14
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/DisplayNameUtil.java39
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/EnumUtil.java35
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/TriFunction.java13
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/QuestProgressFile.java15
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/player/questprogressfile/filters/QuestProgressFilter.java4
7 files changed, 122 insertions, 8 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java
index 144c2ecd..8404d5fe 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/AbstractPlaceholderAPIHook.java
@@ -1,14 +1,20 @@
package com.leonardobishop.quests.bukkit.hook.papi;
import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.common.util.Modern;
import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Contract;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+@Modern(type = Modern.Type.FULL)
+@NullMarked
public interface AbstractPlaceholderAPIHook {
- String replacePlaceholders(Player player, String text);
+ @Contract(pure = true, value = "_, null -> null; _, !null -> !null")
+ @Nullable String replacePlaceholders(@Nullable Player player, @Nullable String text);
void registerExpansion(BukkitQuestsPlugin plugin);
void unregisterExpansion();
-
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java
index 1b70f295..a0b8211f 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java
@@ -1,20 +1,22 @@
package com.leonardobishop.quests.bukkit.hook.papi;
import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.common.util.Modern;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
+@Modern(type = Modern.Type.FULL)
@NullMarked
public final class PlaceholderAPIHook implements AbstractPlaceholderAPIHook {
@Nullable
- private QuestsPlaceholders placeholder;
+ private QuestsPlaceholders expansion;
public PlaceholderAPIHook() {
- this.placeholder = null;
+ this.expansion = null;
}
@Contract(pure = true, value = "_, null -> null; _, !null -> !null")
@@ -38,14 +40,14 @@ public final class PlaceholderAPIHook implements AbstractPlaceholderAPIHook {
@Override
public void registerExpansion(final BukkitQuestsPlugin plugin) {
- this.placeholder = new QuestsPlaceholders(plugin);
- this.placeholder.register();
+ this.expansion = new QuestsPlaceholders(plugin);
+ this.expansion.register();
}
@Override
public void unregisterExpansion() {
- if (this.placeholder != null) {
- this.placeholder.unregister();
+ if (this.expansion != null) {
+ this.expansion.unregister();
}
}
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/DisplayNameUtil.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/DisplayNameUtil.java
new file mode 100644
index 00000000..811b19cd
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/DisplayNameUtil.java
@@ -0,0 +1,39 @@
+package com.leonardobishop.quests.bukkit.hook.papi.util;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack;
+import com.leonardobishop.quests.bukkit.util.chat.Chat;
+import com.leonardobishop.quests.common.quest.Category;
+import com.leonardobishop.quests.common.quest.Quest;
+import com.leonardobishop.quests.common.util.Modern;
+import org.bukkit.inventory.ItemStack;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@Modern(type = Modern.Type.FULL)
+@NullMarked
+public final class DisplayNameUtil {
+
+ public static @Nullable String getStrippedDisplayName(final BukkitQuestsPlugin plugin, final Quest quest) {
+ final QItemStack item = plugin.getQItemStackRegistry().getQuestItemStack(quest);
+
+ if (item == null) {
+ return null;
+ }
+
+ final String displayName = item.getName();
+ return Chat.legacyStrip(displayName);
+ }
+
+ public static @Nullable String getStrippedDisplayName(final BukkitQuestsPlugin plugin, final Category category) {
+ final ItemStack item = plugin.getQItemStackRegistry().getCategoryItemStack(category);
+
+ if (item == null) {
+ return null;
+ }
+
+ //noinspection deprecation
+ final String displayName = item.getItemMeta().getDisplayName();
+ return Chat.legacyStrip(displayName);
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/EnumUtil.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/EnumUtil.java
new file mode 100644
index 00000000..60f6bdaf
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/EnumUtil.java
@@ -0,0 +1,35 @@
+package com.leonardobishop.quests.bukkit.hook.papi.util;
+
+import com.leonardobishop.quests.common.util.Modern;
+import org.jspecify.annotations.NullMarked;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Modern(type = Modern.Type.FULL)
+@NullMarked
+public final class EnumUtil {
+
+ public static <E extends Enum<E> & Named> Map<String, E> namedMap(final Class<E> clazz) {
+ final E[] constants = clazz.getEnumConstants();
+
+ final Map<String, E> map = new HashMap<>(constants.length);
+
+ for (final E constant : constants) {
+ for (final String name : constant.getNames()) {
+ if (map.put(name, constant) != null) {
+ throw new IllegalStateException("'" + name + "' already bound");
+ }
+ }
+ }
+
+ return Collections.unmodifiableMap(map);
+ }
+
+ public interface Named {
+
+ List<String> getNames();
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/TriFunction.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/TriFunction.java
new file mode 100644
index 00000000..8a1da4ed
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/TriFunction.java
@@ -0,0 +1,13 @@
+package com.leonardobishop.quests.bukkit.hook.papi.util;
+
+import com.leonardobishop.quests.common.util.Modern;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@Modern(type = Modern.Type.FULL)
+@NullMarked
+@FunctionalInterface
+public interface TriFunction<T extends @Nullable Object, U extends @Nullable Object, V extends @Nullable Object, R extends @Nullable Object> {
+
+ R apply(T t, U u, V v);
+}
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 4464a8af..e4b6add0 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
@@ -18,6 +18,7 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
/**
* Represents underlying quest progress for a player.
@@ -106,6 +107,20 @@ public final class QuestProgressFile {
}
/**
+ * Passes all {@link Quest} a player has encountered (not to be confused with a collection of quest progress) to specified consumer.
+ */
+ @Contract(pure = true)
+ public void getAllQuestsFromProgressConsumer(final QuestProgressFilter filter, final Consumer<Quest> consumer) {
+ for (final QuestProgress questProgress : this.questProgressMap.values()) {
+ final Quest quest = this.getQuestFromProgress(filter, questProgress);
+
+ if (quest != null) {
+ consumer.accept(quest);
+ }
+ }
+ }
+
+ /**
* 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.
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
index 41af049c..d31625b8 100644
--- 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
@@ -17,6 +17,10 @@ public interface QuestProgressFilter {
QuestProgressFilter DOES_COUNT_TOWARDS_COMPLETED = new DoesCountTowardsCompletedQuestProgressFilter();
QuestProgressFilter DOES_COUNT_TOWARDS_LIMIT = new DoesCountTowardsLimitQuestProgressFilter();
+ // Counting
+ QuestProgressFilter COMPLETED_COUNT = new ConjunctionQuestProgressFilter(QuestProgressFilter.COMPLETED, QuestProgressFilter.DOES_COUNT_TOWARDS_COMPLETED);
+ QuestProgressFilter COMPLETED_BEFORE_COUNT = new ConjunctionQuestProgressFilter(QuestProgressFilter.COMPLETED_BEFORE, QuestProgressFilter.DOES_COUNT_TOWARDS_COMPLETED);
+
@Contract(pure = true)
default boolean matchesQuest(final @NotNull Quest quest) {
return true;