diff --git a/core/pom.xml b/core/pom.xml
index fe54bb80a..982369d49 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -170,8 +170,8 @@
de.tr7zw
- item-nbt-api-plugin
- 2.12.4
+ item-nbt-api
+ 2.13.1
xyz.upperlevel.spigot.book
@@ -265,7 +265,7 @@
me.*
com.github.PikaMug:LocaleLib
- de.tr7zw:item-nbt-api-plugin
+ de.tr7zw:item-nbt-api
org.slf4j:slf4j-simple
org.slf4j:slf4j-api
xyz.upperlevel.spigot.book:spigot-book-api
@@ -285,12 +285,6 @@
plugin.yml
-
- de.tr7zw:item-nbt-api-plugin
-
- plugin.yml
-
-
@@ -298,7 +292,7 @@
me.pikamug.quests.libs.localelib
- de.tr7zw
+ de.tr7zw.changeme.nbtapi
me.pikamug.quests.libs.nbtapi
diff --git a/core/src/main/java/me/pikamug/quests/BukkitQuestsPlugin.java b/core/src/main/java/me/pikamug/quests/BukkitQuestsPlugin.java
index 38e2eff62..b14bc4662 100644
--- a/core/src/main/java/me/pikamug/quests/BukkitQuestsPlugin.java
+++ b/core/src/main/java/me/pikamug/quests/BukkitQuestsPlugin.java
@@ -10,6 +10,7 @@
package me.pikamug.quests;
+import de.tr7zw.changeme.nbtapi.NBT;
import me.pikamug.localelib.LocaleManager;
import me.pikamug.quests.actions.Action;
import me.pikamug.quests.actions.BukkitActionFactory;
@@ -22,10 +23,17 @@ import me.pikamug.quests.convo.misc.QuestAcceptPrompt;
import me.pikamug.quests.dependencies.BukkitDenizenTrigger;
import me.pikamug.quests.dependencies.BukkitDependencies;
import me.pikamug.quests.interfaces.ReloadCallback;
-import me.pikamug.quests.listeners.*;
+import me.pikamug.quests.listeners.BukkitBlockListener;
+import me.pikamug.quests.listeners.BukkitCitizensListener;
+import me.pikamug.quests.listeners.BukkitCommandManager;
+import me.pikamug.quests.listeners.BukkitConvoListener;
+import me.pikamug.quests.listeners.BukkitItemListener;
+import me.pikamug.quests.listeners.BukkitPartiesListener;
+import me.pikamug.quests.listeners.BukkitPlayerListener;
+import me.pikamug.quests.listeners.BukkitUniteListener;
+import me.pikamug.quests.listeners.BukkitZnpcsApiListener;
+import me.pikamug.quests.listeners.BukkitZnpcsListener;
import me.pikamug.quests.logging.BukkitQuestsLog4JFilter;
-import me.pikamug.quests.storage.implementation.jar.BukkitModuleJarStorage;
-import me.pikamug.quests.storage.implementation.ModuleStorageImpl;
import me.pikamug.quests.module.CustomObjective;
import me.pikamug.quests.module.CustomRequirement;
import me.pikamug.quests.module.CustomReward;
@@ -36,9 +44,11 @@ import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.statistics.BukkitMetrics;
import me.pikamug.quests.storage.BukkitStorageFactory;
import me.pikamug.quests.storage.QuesterStorage;
+import me.pikamug.quests.storage.implementation.ModuleStorageImpl;
import me.pikamug.quests.storage.implementation.file.BukkitActionYamlStorage;
import me.pikamug.quests.storage.implementation.file.BukkitConditionYamlStorage;
import me.pikamug.quests.storage.implementation.file.BukkitQuestYamlStorage;
+import me.pikamug.quests.storage.implementation.jar.BukkitModuleJarStorage;
import me.pikamug.quests.tasks.BukkitNpcEffectThread;
import me.pikamug.quests.tasks.BukkitPlayerMoveThread;
import me.pikamug.quests.util.BukkitLang;
@@ -152,6 +162,9 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
conditionFactory = new BukkitConditionFactory(this);
depends = new BukkitDependencies(this);
trigger = new BukkitDenizenTrigger(this);
+ if (!NBT.preloadApi()) {
+ getLogger().warning("NBT-API wasn't initialized properly");
+ }
// 3 - Load main config
configSettings.init();
@@ -588,7 +601,7 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
*
* @param resourcePath jar file location starting from resource folder, i.e. "lang/el-GR/strings.yml"
* @param outputPath file destination starting from Quests folder, i.e. "lang/el-GR/strings.yml"
- * @param replace whether or not to replace the destination file
+ * @param replace whether to replace the destination file
*/
@Override
public void saveResourceAs(String resourcePath, final String outputPath, final boolean replace) {
diff --git a/core/src/main/java/me/pikamug/quests/listeners/BukkitBlockListener.java b/core/src/main/java/me/pikamug/quests/listeners/BukkitBlockListener.java
index 374d4c390..4eb40f6bd 100644
--- a/core/src/main/java/me/pikamug/quests/listeners/BukkitBlockListener.java
+++ b/core/src/main/java/me/pikamug/quests/listeners/BukkitBlockListener.java
@@ -10,6 +10,7 @@
package me.pikamug.quests.listeners;
+import de.tr7zw.changeme.nbtapi.NBT;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.enums.ObjectiveType;
import me.pikamug.quests.events.quester.BukkitQuesterPostUpdateObjectiveEvent;
@@ -26,6 +27,7 @@ import me.pikamug.quests.util.BukkitLang;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
+import org.bukkit.block.data.Ageable;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -403,7 +405,14 @@ public class BukkitBlockListener implements Listener {
// https://github.com/PikaMug/Quests/issues/2243
}
try {
- return new ItemStack(block.getBlockData().getPlacementMaterial(), 1, durability);
+ // Should only happen on Paper 1.21+
+ final ItemStack item = new ItemStack(block.getBlockData().getPlacementMaterial());
+ if (block.getBlockData() instanceof Ageable) {
+ NBT.modify(item, nbt -> {
+ nbt.setShort("quests_age", (short) ((Ageable)block.getBlockData()).getAge());
+ });
+ }
+ return item;
} catch (Exception e) {
// https://github.com/PikaMug/Quests/issues/2256
}
diff --git a/core/src/main/java/me/pikamug/quests/player/BukkitQuester.java b/core/src/main/java/me/pikamug/quests/player/BukkitQuester.java
index 51a4352b3..67f146453 100644
--- a/core/src/main/java/me/pikamug/quests/player/BukkitQuester.java
+++ b/core/src/main/java/me/pikamug/quests/player/BukkitQuester.java
@@ -14,6 +14,7 @@ import com.alessiodp.parties.api.interfaces.Party;
import com.alessiodp.parties.api.interfaces.PartyPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.player.UserManager;
+import de.tr7zw.changeme.nbtapi.NBT;
import io.github.znetworkw.znpcservers.npc.NPC;
import lol.pyr.znpcsplus.api.npc.Npc;
import me.clip.placeholderapi.PlaceholderAPI;
@@ -1827,6 +1828,19 @@ public class BukkitQuester implements Quester {
// Age toBreak unspecified so ignore durability
goal = toBreak;
}
+ } else if (Material.getMaterial("CRAFTER") != null && broken.getType().isEdible()) {
+ // Paper 1.21+ is special case
+ final short toBreakAge = NBT.get(toBreak, nbt -> (short) nbt.getShort("quests_age"));
+ final short brokenAge = NBT.get(broken, nbt -> (short) nbt.getShort("quests_age"));
+ if (toBreakAge > 0) {
+ // Age toBreak specified so check for durability
+ if (brokenAge == toBreakAge) {
+ goal = toBreak;
+ }
+ } else {
+ // Age toBreak unspecified so ignore durability
+ goal = toBreak;
+ }
} else if (broken.getType().name().equals("RED_ROSE")) {
// Flowers are unique so check for durability
if (broken.getDurability() == toBreak.getDurability()) {
@@ -3820,7 +3834,7 @@ public class BukkitQuester implements Quester {
final Stage stage = getCurrentStage(quest);
if (stage != null) {
quest.updateCompass(this, stage);
- // TODO - decide whether or not to handle this
+ // TODO - decide whether to handle this
/*if (q.equals(quest) == false) {
if (getPlayer() != null && getPlayer().isOnline()) {
quitQuest(quest, ChatColor.GOLD + Lang.get("questModified")
diff --git a/core/src/main/java/me/pikamug/quests/util/BukkitItemUtil.java b/core/src/main/java/me/pikamug/quests/util/BukkitItemUtil.java
index 6626df2d6..34bcb2007 100644
--- a/core/src/main/java/me/pikamug/quests/util/BukkitItemUtil.java
+++ b/core/src/main/java/me/pikamug/quests/util/BukkitItemUtil.java
@@ -10,6 +10,7 @@
package me.pikamug.quests.util;
+import de.tr7zw.changeme.nbtapi.NBT;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Color;
@@ -227,11 +228,17 @@ public class BukkitItemUtil {
if (mat == null) {
return null;
}
+ ItemStack item;
if (mat.isBlock() && Material.getMaterial("CRAFTER") != null) {
// Paper 1.21+ does not allow ItemStack from unobtainable blocks (i.e. CARROTS block)
- mat = mat.createBlockData().getPlacementMaterial();
+ item = new ItemStack(mat.createBlockData().getPlacementMaterial(), amount);
+ NBT.modify(item, nbt -> {
+ nbt.setShort("quests_age", durability);
+ });
+ } else {
+ item = new ItemStack(mat, amount, durability);
}
- return new ItemStack(mat, amount, durability);
+ return item;
} catch (final Exception e) {
try {
Bukkit.getLogger().warning(material + " x " + amount