diff --git a/main/pom.xml b/main/pom.xml
index 5ff5adc94..c56674af1 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -131,7 +131,7 @@
com.github.PikaMug
LocaleLib
- 2.2
+ 2.3
mysql
diff --git a/main/src/main/java/me/blackvein/quests/QuestData.java b/main/src/main/java/me/blackvein/quests/QuestData.java
index ae9d4face..b21a2806d 100644
--- a/main/src/main/java/me/blackvein/quests/QuestData.java
+++ b/main/src/main/java/me/blackvein/quests/QuestData.java
@@ -12,12 +12,14 @@
package me.blackvein.quests;
-import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import java.util.Collection;
import java.util.LinkedList;
+/**
+ * Quest objective data for a specified Quester
+ */
public class QuestData {
private final Quester quester;
diff --git a/main/src/main/java/me/blackvein/quests/Quester.java b/main/src/main/java/me/blackvein/quests/Quester.java
index 968d8bc86..a49e2031f 100644
--- a/main/src/main/java/me/blackvein/quests/Quester.java
+++ b/main/src/main/java/me/blackvein/quests/Quester.java
@@ -54,6 +54,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Crops;
import org.jetbrains.annotations.NotNull;
@@ -429,7 +430,6 @@ public class Quester implements Comparable {
* @param quest The quest to start
* @param ignoreRequirements Whether to ignore Requirements
*/
- @SuppressWarnings("deprecation")
public void takeQuest(final Quest quest, final boolean ignoreRequirements) {
if (quest == null) {
return;
@@ -1926,6 +1926,67 @@ public class Quester implements Comparable {
}
}
+ /**
+ * Mark book as enchanted if Quester has such an objective
+ *
+ * @param quest The quest for which the item is being enchanted
+ * @param itemStack The book being enchanted
+ */
+ public void enchantBook(final Quest quest, final ItemStack itemStack,
+ final Map enchantsToAdd) {
+ int currentIndex = -1;
+ final LinkedList matches = new LinkedList<>();
+ for (final ItemStack is : getQuestData(quest).itemsEnchanted) {
+ currentIndex++;
+ if (is.getItemMeta() instanceof EnchantmentStorageMeta) {
+ if (((EnchantmentStorageMeta)is.getItemMeta()).getStoredEnchants().equals(enchantsToAdd)) {
+ matches.add(currentIndex);
+ }
+ }
+ }
+ if (matches.isEmpty()) {
+ return;
+ }
+ for (final Integer match : matches) {
+ final LinkedList items = new LinkedList<>(getQuestData(quest).itemsEnchanted);
+ final ItemStack found = items.get(match);
+ final int amount = found.getAmount();
+ final int toEnchant = getCurrentStage(quest).itemsToEnchant.get(match).getAmount();
+
+ final ObjectiveType type = ObjectiveType.ENCHANT_ITEM;
+ final QuesterPreUpdateObjectiveEvent preEvent = new QuesterPreUpdateObjectiveEvent(this, quest,
+ new Objective(type, amount, toEnchant));
+ plugin.getServer().getPluginManager().callEvent(preEvent);
+
+ final int newAmount = itemStack.getAmount() + amount;
+ final Material m = itemStack.getType();
+ if (amount < toEnchant) {
+ if (newAmount >= toEnchant) {
+ found.setAmount(toEnchant);
+ getQuestData(quest).itemsEnchanted.set(items.indexOf(found), found);
+ finishObjective(quest, new Objective(type, new ItemStack(m, 1), found), null, null, null, null,
+ null, null, null);
+
+ // Multiplayer
+ dispatchMultiplayerObjectives(quest, getCurrentStage(quest), (final Quester q) -> {
+ q.getQuestData(quest).itemsEnchanted.set(items.indexOf(found), found);
+ q.finishObjective(quest, new Objective(type, new ItemStack(m, 1), found), null, null, null,
+ null, null, null, null);
+ return null;
+ });
+ } else {
+ found.setAmount(newAmount);
+ getQuestData(quest).itemsEnchanted.set(items.indexOf(found), found);
+ }
+ return;
+ }
+
+ final QuesterPostUpdateObjectiveEvent postEvent = new QuesterPostUpdateObjectiveEvent(this, quest,
+ new Objective(type, itemStack.getAmount() + amount, toEnchant));
+ plugin.getServer().getPluginManager().callEvent(postEvent);
+ }
+ }
+
/**
* Mark item as enchanted if Quester has such an objective
*
@@ -1935,15 +1996,17 @@ public class Quester implements Comparable {
public void enchantItem(final Quest quest, final ItemStack itemStack) {
int currentIndex = -1;
final LinkedList matches = new LinkedList<>();
- for (final ItemStack is : getQuestData(quest).itemsEnchanted) {
- currentIndex++;
- if (!is.getEnchantments().isEmpty()) {
- if (ItemUtil.compareItems(itemStack, is, true) == 0) {
- matches.add(currentIndex);
- }
- } else {
- if (ItemUtil.compareItems(itemStack, is, true) == -4) {
- matches.add(currentIndex);
+ if (!itemStack.getType().equals(Material.BOOK)) {
+ for (final ItemStack is : getQuestData(quest).itemsEnchanted) {
+ currentIndex++;
+ if (!is.getEnchantments().isEmpty()) {
+ if (ItemUtil.compareItems(itemStack, is, true) == 0) {
+ matches.add(currentIndex);
+ }
+ } else {
+ if (ItemUtil.compareItems(itemStack, is, true) == -4) {
+ matches.add(currentIndex);
+ }
}
}
}
@@ -2113,7 +2176,6 @@ public class Quester implements Comparable {
* @param npc The NPC being delivered to
* @param itemStack The item being delivered
*/
- @SuppressWarnings("deprecation")
public void deliverToNPC(final Quest quest, final NPC npc, final ItemStack itemStack) {
if (npc == null) {
return;
@@ -3283,12 +3345,12 @@ public class Quester implements Comparable {
}
}
if (!quest.getStage(stage).citizensToKill.isEmpty()) {
- for (final Integer toKill : quest.getStage(stage).citizensToKill) {
+ for (final Integer ignored : quest.getStage(stage).citizensToKill) {
data.citizensNumKilled.add(0);
}
}
if (!quest.getStage(stage).mobsToKill.isEmpty()) {
- for (final EntityType toKill : quest.getStage(stage).mobsToKill) {
+ for (final EntityType ignored : quest.getStage(stage).mobsToKill) {
data.mobNumKilled.add(0);
}
}
diff --git a/main/src/main/java/me/blackvein/quests/Quests.java b/main/src/main/java/me/blackvein/quests/Quests.java
index 4925824af..a3a76c131 100644
--- a/main/src/main/java/me/blackvein/quests/Quests.java
+++ b/main/src/main/java/me/blackvein/quests/Quests.java
@@ -1266,7 +1266,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
}
if (getSettings().canTranslateNames() && is.hasItemMeta()) {
// Bukkit version is 1.9+
- localeManager.sendMessage(quester.getPlayer(), message, is.getType(), is.getDurability(),
+ localeManager.sendMessage(quester.getPlayer(), message, is.getType(), is.getDurability(),
is.getEnchantments(), is.getItemMeta());
} else if (getSettings().canTranslateNames() && !is.hasItemMeta()
&& Material.getMaterial("LINGERING_POTION") == null) {
diff --git a/main/src/main/java/me/blackvein/quests/listeners/ItemListener.java b/main/src/main/java/me/blackvein/quests/listeners/ItemListener.java
index 460470296..1a7e710af 100644
--- a/main/src/main/java/me/blackvein/quests/listeners/ItemListener.java
+++ b/main/src/main/java/me/blackvein/quests/listeners/ItemListener.java
@@ -153,11 +153,7 @@ public class ItemListener implements Listener {
if (plugin.canUseQuests(evt.getEnchanter().getUniqueId())) {
final ItemStack enchantedItem = evt.getItem().clone();
enchantedItem.setAmount(1);
- try {
- enchantedItem.addEnchantments(evt.getEnchantsToAdd());
- } catch (final IllegalArgumentException e) {
- // Ignore
- }
+ enchantedItem.addUnsafeEnchantments(evt.getEnchantsToAdd());
final Quester quester = plugin.getQuester(evt.getEnchanter().getUniqueId());
final ObjectiveType type = ObjectiveType.ENCHANT_ITEM;
final Set dispatchedQuestIDs = new HashSet<>();
@@ -168,12 +164,20 @@ public class ItemListener implements Listener {
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective(type)) {
- quester.enchantItem(quest, enchantedItem);
+ if (enchantedItem.getType().equals(Material.BOOK)) {
+ quester.enchantBook(quest, enchantedItem, evt.getEnchantsToAdd());
+ } else {
+ quester.enchantItem(quest, enchantedItem);
+ }
}
dispatchedQuestIDs.addAll(quester.dispatchMultiplayerEverything(quest, type, (final Quester q, final Quest cq) -> {
if (!dispatchedQuestIDs.contains(cq.getId())) {
- q.enchantItem(cq, enchantedItem);
+ if (enchantedItem.getType().equals(Material.BOOK)) {
+ q.enchantBook(cq, enchantedItem, evt.getEnchantsToAdd());
+ } else {
+ q.enchantItem(cq, enchantedItem);
+ }
}
return null;
}));
diff --git a/main/src/main/java/me/blackvein/quests/util/ItemUtil.java b/main/src/main/java/me/blackvein/quests/util/ItemUtil.java
index dfd80fdb0..979f6cf71 100644
--- a/main/src/main/java/me/blackvein/quests/util/ItemUtil.java
+++ b/main/src/main/java/me/blackvein/quests/util/ItemUtil.java
@@ -173,13 +173,16 @@ public class ItemUtil {
return -5;
}
if (one.getType().equals(Material.ENCHANTED_BOOK)) {
- final EnchantmentStorageMeta esMeta1 = (EnchantmentStorageMeta) one.getItemMeta();
- final EnchantmentStorageMeta esMeta2 = (EnchantmentStorageMeta) two.getItemMeta();
- if (esMeta1.hasStoredEnchants() && !esMeta2.hasStoredEnchants()) {
- return -6;
- }
- if (!esMeta1.getStoredEnchants().equals(esMeta2.getStoredEnchants())) {
- return -6;
+ if (one.getItemMeta() instanceof EnchantmentStorageMeta
+ && two.getItemMeta() instanceof EnchantmentStorageMeta) {
+ final EnchantmentStorageMeta esMeta1 = (EnchantmentStorageMeta) one.getItemMeta();
+ final EnchantmentStorageMeta esMeta2 = (EnchantmentStorageMeta) two.getItemMeta();
+ if (esMeta1.hasStoredEnchants() && !esMeta2.hasStoredEnchants()) {
+ return -6;
+ }
+ if (!esMeta1.getStoredEnchants().equals(esMeta2.getStoredEnchants())) {
+ return -6;
+ }
}
}
return 0;
@@ -453,45 +456,39 @@ public class ItemUtil {
* @return formatted string, or null if invalid stack
*/
public static String serializeItemStack(final ItemStack is) {
- String serial;
+ final StringBuilder serial;
if (is == null) {
return null;
}
- serial = "name-" + is.getType().name();
- serial += ":amount-" + is.getAmount();
+ serial = new StringBuilder("name-" + is.getType().name());
+ serial.append(":amount-").append(is.getAmount());
if (is.getDurability() != 0) {
- serial += ":data-" + is.getDurability();
+ serial.append(":data-").append(is.getDurability());
}
if (!is.getEnchantments().isEmpty()) {
for (final Entry e : is.getEnchantments().entrySet()) {
- serial += ":enchantment-" + e.getKey().getName() + " " + e.getValue();
+ serial.append(":enchantment-").append(e.getKey().getName()).append(" ").append(e.getValue());
}
}
if (is.hasItemMeta()) {
final ItemMeta meta = is.getItemMeta();
if (meta.hasDisplayName()) {
- serial += ":displayname-" + meta.getDisplayName();
+ serial.append(":displayname-").append(meta.getDisplayName());
}
if (meta.hasLore()) {
for (final String s : meta.getLore()) {
- serial += ":lore-" + s;
+ serial.append(":lore-").append(s);
}
}
- final LinkedHashMap map = new LinkedHashMap();
- map.putAll(meta.serialize());
-
- if (map.containsKey("lore")) {
- map.remove("lore");
- }
- if (map.containsKey("display-name")) {
- map.remove("display-name");
- }
+ final LinkedHashMap map = new LinkedHashMap<>(meta.serialize());
+ map.remove("lore");
+ map.remove("display-name");
for (final String key : map.keySet()) {
- serial += ":" + key + "-" + map.get(key).toString().replace("minecraft:", "minecraft|");
+ serial.append(":").append(key).append("-").append(map.get(key).toString().replace("minecraft:", "minecraft|"));
}
}
- return serial;
+ return serial.toString();
}
/**
@@ -516,7 +513,7 @@ public class ItemUtil {
* @return true display or item name, plus durability and amount, plus enchantments
*/
public static String getDisplayString(final ItemStack is) {
- StringBuilder text;
+ final StringBuilder text;
if (is == null) {
return null;
}
@@ -576,7 +573,7 @@ public class ItemUtil {
if (is == null) {
return null;
}
- String text = "";
+ final String text;
if (is.getItemMeta() != null && is.getItemMeta().hasDisplayName()) {
text = "" + ChatColor.DARK_AQUA + ChatColor.ITALIC + is.getItemMeta().getDisplayName();
} else {