From 50c639f9abe01f751271d9c58c0bd185d32cd781 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Thu, 5 Jun 2025 02:51:12 +0200 Subject: PlaceholderAPI hook cleanup --- .../hook/papi/AbstractPlaceholderAPIHook.java | 10 ++++-- .../bukkit/hook/papi/PlaceholderAPIHook.java | 14 ++++---- .../bukkit/hook/papi/util/DisplayNameUtil.java | 39 ++++++++++++++++++++++ .../quests/bukkit/hook/papi/util/EnumUtil.java | 35 +++++++++++++++++++ .../quests/bukkit/hook/papi/util/TriFunction.java | 13 ++++++++ .../questprogressfile/QuestProgressFile.java | 15 +++++++++ .../filters/QuestProgressFilter.java | 4 +++ 7 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/DisplayNameUtil.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/EnumUtil.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/util/TriFunction.java 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 & Named> Map namedMap(final Class clazz) { + final E[] constants = clazz.getEnumConstants(); + + final Map 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 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 { + + 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. @@ -105,6 +106,20 @@ public final class QuestProgressFile { return quests; } + /** + * 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 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 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; -- cgit v1.2.3-70-g09d2