Handle legacy item names for events, fixes #557. Bump version

This commit is contained in:
BuildTools 2018-12-04 19:30:44 -05:00
parent 2338c127fb
commit e363cd4cb0
4 changed files with 51 additions and 40 deletions

View File

@ -3,7 +3,7 @@
<groupId>me.blackvein.quests</groupId>
<artifactId>quests</artifactId>
<version>3.4.6</version>
<version>3.4.7</version>
<name>quests</name>
<url>https://github.com/FlyingPikachu/Quests/</url>
<packaging>jar</packaging>

View File

@ -32,7 +32,6 @@ import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import me.blackvein.quests.util.ItemUtil;
import me.blackvein.quests.util.Lang;
import me.blackvein.quests.util.MiscUtil;
import me.blackvein.quests.util.RomanNumeral;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.event.NPCDeathEvent;

View File

@ -2600,22 +2600,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
return exists;
}
@SuppressWarnings("deprecation")
private ItemStack processItemStack(String questName, String material, int amount, short durability) {
try {
return new ItemStack(Material.matchMaterial(material), amount, durability);
} catch (Exception e) {
try {
getLogger().warning(material + " is invalid for quest " + questName + "! You may need to update your quests.yml "
+ "in accordance with https://github.com/FlyingPikachu/Quests/wiki/Item-Formatting#list");
return new ItemStack(Material.matchMaterial(material, true), amount, durability);
} catch (Exception e2) {
getLogger().severe("Unable to use LEGACY_" + material + " for quest " + questName);
e2.printStackTrace();
return null;
}
}
}
private void processStages(Quest quest, FileConfiguration config, String questName) throws StageFailedException {
ConfigurationSection questStages = config.getConfigurationSection("quests." + questName + ".stages.ordered");
@ -2681,10 +2666,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
for (String s : breaknames) {
ItemStack is;
if (breakdurability.get(breaknames.indexOf(s)) != -1) {
is = processItemStack(questName, s, breakamounts.get(breaknames.indexOf(s)), breakdurability.get(breaknames.indexOf(s)));
is = ItemUtil.processItemStack(s, breakamounts.get(breaknames.indexOf(s)), breakdurability.get(breaknames.indexOf(s)));
} else {
// Legacy
is = processItemStack(questName, s, breakamounts.get(breaknames.indexOf(s)), (short) 0);
is = ItemUtil.processItemStack(s, breakamounts.get(breaknames.indexOf(s)), (short) 0);
}
if (Material.matchMaterial(s) != null) {
oStage.blocksToBreak.add(is);
@ -2720,10 +2705,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
for (String s : damagenames) {
ItemStack is;
if (damagedurability.get(damagenames.indexOf(s)) != -1) {
is = processItemStack(questName, s, damageamounts.get(damagenames.indexOf(s)), damagedurability.get(damagenames.indexOf(s)));
is = ItemUtil.processItemStack(s, damageamounts.get(damagenames.indexOf(s)), damagedurability.get(damagenames.indexOf(s)));
} else {
// Legacy
is = processItemStack(questName, s, damageamounts.get(damagenames.indexOf(s)), (short) 0);
is = ItemUtil.processItemStack(s, damageamounts.get(damagenames.indexOf(s)), (short) 0);
}
if (Material.matchMaterial(s) != null) {
oStage.blocksToDamage.add(is);
@ -2759,10 +2744,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
for (String s : placenames) {
ItemStack is;
if (placedurability.get(placenames.indexOf(s)) != -1) {
is = processItemStack(questName, s, placeamounts.get(placenames.indexOf(s)), placedurability.get(placenames.indexOf(s)));
is = ItemUtil.processItemStack(s, placeamounts.get(placenames.indexOf(s)), placedurability.get(placenames.indexOf(s)));
} else {
// Legacy
is = processItemStack(questName, s, placeamounts.get(placenames.indexOf(s)), (short) 0);
is = ItemUtil.processItemStack(s, placeamounts.get(placenames.indexOf(s)), (short) 0);
}
if (Material.matchMaterial(s) != null) {
oStage.blocksToPlace.add(is);
@ -2798,10 +2783,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
for (String s : usenames) {
ItemStack is;
if (usedurability.get(usenames.indexOf(s)) != -1) {
is = processItemStack(questName, s, useamounts.get(usenames.indexOf(s)), usedurability.get(usenames.indexOf(s)));
is = ItemUtil.processItemStack(s, useamounts.get(usenames.indexOf(s)), usedurability.get(usenames.indexOf(s)));
} else {
// Legacy
is = processItemStack(questName, s, useamounts.get(usenames.indexOf(s)), (short) 0);
is = ItemUtil.processItemStack(s, useamounts.get(usenames.indexOf(s)), (short) 0);
}
if (Material.matchMaterial(s) != null) {
oStage.blocksToUse.add(is);
@ -2837,10 +2822,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
for (String s : cutnames) {
ItemStack is;
if (cutdurability.get(cutnames.indexOf(s)) != -1) {
is = processItemStack(questName, s, cutamounts.get(cutnames.indexOf(s)), cutdurability.get(cutnames.indexOf(s)));
is = ItemUtil.processItemStack(s, cutamounts.get(cutnames.indexOf(s)), cutdurability.get(cutnames.indexOf(s)));
} else {
// Legacy
is = processItemStack(questName, s, cutamounts.get(cutnames.indexOf(s)), (short) 0);
is = ItemUtil.processItemStack(s, cutamounts.get(cutnames.indexOf(s)), (short) 0);
}
if (Material.matchMaterial(s) != null) {
oStage.blocksToCut.add(is);

View File

@ -96,6 +96,32 @@ public class ItemUtil {
}
return 0;
}
/**
* Returns an ItemStack based on given values. Checks for legacy pre-1.13 names. Other traits such as
* enchantments and lore cannot be added via this method and must be done separately.
*
* @param material Item name suitable for Material.matchMaterial()
* @param amount The number of items in the stack
* @param durability The data value of the item, default of 0
* @return ItemStack, or null if invalid format
*/
@SuppressWarnings("deprecation")
public static ItemStack processItemStack(String material, int amount, short durability) {
try {
return new ItemStack(Material.matchMaterial(material), amount, durability);
} catch (Exception e) {
try {
Bukkit.getLogger().warning(material + " is invalid! You may need to update your quests.yml or events.yml "
+ "in accordance with https://github.com/FlyingPikachu/Quests/wiki/Item-Formatting#list");
return new ItemStack(Material.matchMaterial(material, true), amount, durability);
} catch (Exception e2) {
Bukkit.getLogger().severe("Unable to use LEGACY_" + material + " for as item name");
e2.printStackTrace();
return null;
}
}
}
/**
* Get ItemStack from formatted string. See serialize() for reverse function.
@ -112,27 +138,24 @@ public class ItemUtil {
}
ItemStack stack = null;
String[] args = data.split(":");
ItemMeta meta = null;
EnchantmentStorageMeta esmeta = null;
String name = null;
int amount = 0;
short durability = 0;
Map<Enchantment, Integer> enchs = new HashMap<Enchantment, Integer>();
String display = null;
LinkedList<String> lore = new LinkedList<String>();
LinkedHashMap<Enchantment, Integer> stored = new LinkedHashMap<Enchantment, Integer>();
LinkedHashMap<String, Object> extra = new LinkedHashMap<String, Object>();
ItemMeta meta = null;
EnchantmentStorageMeta esmeta = null;
for (String targ : args) {
String arg = targ.replace("minecraft|", "minecraft:");
if (arg.startsWith("name-")) {
try {
stack = new ItemStack(Material.matchMaterial(arg.substring(5).toUpperCase()));
} catch (Exception e) {
Bukkit.getLogger().severe("[Quests] The item name \'" + arg.substring(5).toUpperCase() + "\' is invalid. Make sure quests.yml is UTF-8 encoded");
return null;
}
meta = stack.getItemMeta();
name = arg.substring(5).toUpperCase();
} else if (arg.startsWith("amount-")) {
stack.setAmount(Integer.parseInt(arg.substring(7)));
amount = Integer.parseInt(arg.substring(7));
} else if (arg.startsWith("data-")) {
stack.setDurability(Short.parseShort(arg.substring(5)));
durability = Short.parseShort(arg.substring(5));
} else if (arg.startsWith("enchantment-")) {
String[] temp = arg.substring(12).split(" ");
try {
@ -196,7 +219,11 @@ public class ItemUtil {
return null;
}
}
stack = processItemStack(name, amount, durability);
if (stack == null) {
return null;
}
meta = stack.getItemMeta();
if (!extra.isEmpty()) {
meta = ItemUtil.deserializeItemMeta(meta.getClass(), (Map<String, Object>) extra);
}