From 133a02e7ea7eb8e04d2d173b327724a7e5fbcc0a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 17 Dec 2021 21:57:37 -0500 Subject: [PATCH 1/3] Prevent legacy material support from being initiated --- .../earth2me/essentials/MetaItemStack.java | 2 +- .../java/com/earth2me/essentials/Trade.java | 13 ++++-- .../java/com/earth2me/essentials/Worth.java | 10 +++-- .../essentials/commands/Commandcondense.java | 6 ++- .../essentials/commands/Commandgive.java | 3 +- .../essentials/commands/Commanditemdb.java | 3 +- .../essentials/commands/Commandrecipe.java | 6 ++- .../essentials/commands/Commandrepair.java | 11 ++--- .../essentials/commands/Commandskull.java | 2 +- .../essentials/commands/Commandworth.java | 3 +- .../essentials/items/AbstractItemDb.java | 19 ++++++-- .../earth2me/essentials/signs/SignTrade.java | 3 +- .../essentials/utils/MaterialUtil.java | 43 +++++++++++++------ .../EssentialsAntiBuildListener.java | 28 +++++++++--- 14 files changed, 106 insertions(+), 46 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java index 015eb03f12c..d1edb3e028c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java @@ -210,7 +210,7 @@ public void addStringMeta(final CommandSource sender, final boolean allowUnsafe, final boolean value = split.length <= 1 || Boolean.parseBoolean(split[1]); setUnbreakable(ess, stack, value); } else if (split.length > 1 && (split[0].equalsIgnoreCase("player") || split[0].equalsIgnoreCase("owner")) && hasMetaPermission(sender, "head", false, true, ess)) { - if (MaterialUtil.isPlayerHead(stack.getType(), stack.getDurability())) { + if (MaterialUtil.isPlayerHead(stack)) { final String owner = split[1]; setSkullOwner(ess, stack, owner); } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/Trade.java b/Essentials/src/main/java/com/earth2me/essentials/Trade.java index 94da5c9f2dc..671aac893d7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Trade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Trade.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.craftbukkit.SetExpFix; import com.earth2me.essentials.utils.NumberUtil; +import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.IEssentials; import net.ess3.api.IUser; import net.ess3.api.MaxMoneyException; @@ -95,8 +96,10 @@ public static void log(final String type, final String subtype, final String eve } else { if (charge.getItemStack() != null) { sb.append(charge.getItemStack().getAmount()).append(","); - sb.append(charge.getItemStack().getType().toString()).append(","); - sb.append(charge.getItemStack().getDurability()); + sb.append(charge.getItemStack().getType()).append(","); + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + sb.append(charge.getItemStack().getDurability()); + } } if (charge.getMoney() != null) { sb.append(charge.getMoney()).append(","); @@ -119,8 +122,10 @@ public static void log(final String type, final String subtype, final String eve } else { if (pay.getItemStack() != null) { sb.append(pay.getItemStack().getAmount()).append(","); - sb.append(pay.getItemStack().getType().toString()).append(","); - sb.append(pay.getItemStack().getDurability()); + sb.append(pay.getItemStack().getType()).append(","); + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + sb.append(pay.getItemStack().getDurability()); + } } if (pay.getMoney() != null) { sb.append(pay.getMoney()).append(","); diff --git a/Essentials/src/main/java/com/earth2me/essentials/Worth.java b/Essentials/src/main/java/com/earth2me/essentials/Worth.java index dc9e6405830..1b2b1dd6b89 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Worth.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Worth.java @@ -30,13 +30,15 @@ public Worth(final File dataFolder) { * @return The price from the config. */ public BigDecimal getPrice(final IEssentials ess, final ItemStack itemStack) { - BigDecimal result; + BigDecimal result = BigDecimal.ONE.negate(); final String itemname = itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); - // Check for matches with data value from stack - // Note that we always default to BigDecimal.ONE.negate(), equivalent to -1 - result = config.getBigDecimal("worth." + itemname + "." + itemStack.getDurability(), BigDecimal.ONE.negate()); + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + // Check for matches with data value from stack + // Note that we always default to BigDecimal.ONE.negate(), equivalent to -1 + result = config.getBigDecimal("worth." + itemname + "." + itemStack.getDurability(), BigDecimal.ONE.negate()); + } // Check for matches with data value 0 if (result.signum() < 0) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java index 7fd64cb208f..4abc20e9bb6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Trade; import com.earth2me.essentials.Trade.OverflowType; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.MaxMoneyException; import org.bukkit.Material; import org.bukkit.Server; @@ -153,6 +154,8 @@ private Collection getStackOnRecipeMatch(final Recipe recipe, final I return null; } + final boolean legacy = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); + boolean match = true; final Iterator iter = inputList.iterator(); while (iter.hasNext()) { @@ -161,8 +164,7 @@ private Collection getStackOnRecipeMatch(final Recipe recipe, final I iter.remove(); continue; } - - if (inputSlot.getDurability() == Short.MAX_VALUE) { + if (legacy && inputSlot.getDurability() == Short.MAX_VALUE) { inputSlot.setDurability((short) 0); } if (!inputSlot.isSimilar(stack)) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java index 58310a1a223..cc34784b12b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.utils.NumberUtil; +import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; import org.bukkit.Material; import org.bukkit.Server; @@ -37,7 +38,7 @@ public void run(final Server server, final CommandSource sender, final String co } try { - if (args.length > 3 && NumberUtil.isInt(args[2]) && NumberUtil.isInt(args[3])) { + if (args.length > 3 && VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01) && NumberUtil.isInt(args[2]) && NumberUtil.isInt(args[3])) { stack.setAmount(Integer.parseInt(args[2])); stack.setDurability(Short.parseShort(args[3])); } else if (args.length > 2 && Integer.parseInt(args[2]) > 0) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java index ba6ceeb3f97..7eb77767a5d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.utils.MaterialUtil; import com.earth2me.essentials.utils.StringUtil; import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Material; @@ -49,7 +50,7 @@ protected void run(final Server server, final CommandSource sender, final String if (itemHeld && itemStack.getType() != Material.AIR) { final int maxuses = itemStack.getType().getMaxDurability(); - final int durability = (maxuses + 1) - itemStack.getDurability(); + final int durability = (maxuses + 1) - MaterialUtil.getDamage(itemStack); if (maxuses != 0) { sender.sendMessage(tl("durability", Integer.toString(durability))); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java index 3e4dcb48771..075b29acfef 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java @@ -111,13 +111,14 @@ public void shapedRecipe(final CommandSource sender, final ShapedRecipe recipe, final InventoryView view = user.getBase().openWorkbench(null, true); final String[] recipeShape = recipe.getShape(); final Map ingredientMap = recipe.getIngredientMap(); + final boolean legacy = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); for (int j = 0; j < recipeShape.length; j++) { for (int k = 0; k < recipeShape[j].length(); k++) { final ItemStack item = ingredientMap.get(recipeShape[j].toCharArray()[k]); if (item == null) { continue; } - if (item.getDurability() == Short.MAX_VALUE) { + if (legacy && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } view.getTopInventory().setItem(j * 3 + k + 1, item); @@ -157,9 +158,10 @@ public void shapelessRecipe(final CommandSource sender, final ShapelessRecipe re final User user = ess.getUser(sender.getPlayer()); user.setRecipeSee(true); final InventoryView view = user.getBase().openWorkbench(null, true); + final boolean legacy = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); for (int i = 0; i < ingredients.size(); i++) { final ItemStack item = ingredients.get(i); - if (item.getDurability() == Short.MAX_VALUE) { + if (legacy && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } view.setItem(i + 1, item); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java index 252a230364a..c21fd603385 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.MaterialUtil; import com.earth2me.essentials.utils.StringUtil; import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; @@ -39,7 +40,7 @@ public void run(final Server server, final User user, final String commandLabel, public void repairHand(final User user) throws Exception { final ItemStack item = user.getItemInHand(); - if (item == null || item.getType().isBlock() || item.getDurability() == 0) { + if (item == null || item.getType().isBlock() || (MaterialUtil.getDamage(item) == 0)) { throw new Exception(tl("repairInvalidType")); } @@ -81,16 +82,16 @@ private void repairItem(final ItemStack item) throws Exception { throw new Exception(tl("repairInvalidType")); } - if (item.getDurability() == 0) { + if (MaterialUtil.getDamage(item) == 0) { throw new Exception(tl("repairAlreadyFixed")); } - item.setDurability((short) 0); + MaterialUtil.setDamage(item, 0); } - private void repairItems(final ItemStack[] items, final IUser user, final List repaired) throws Exception { + private void repairItems(final ItemStack[] items, final IUser user, final List repaired) { for (final ItemStack item : items) { - if (item == null || item.getType().isBlock() || item.getDurability() == 0) { + if (item == null || item.getType().isBlock() || MaterialUtil.getDamage(item) == 0) { continue; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java index 07b9aac8cd8..af5d3a20ab4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandskull.java @@ -42,7 +42,7 @@ protected void run(final Server server, final User user, final String commandLab final SkullMeta metaSkull; boolean spawn = false; - if (itemSkull != null && MaterialUtil.isPlayerHead(itemSkull.getType(), itemSkull.getDurability())) { + if (itemSkull != null && MaterialUtil.isPlayerHead(itemSkull)) { metaSkull = (SkullMeta) itemSkull.getItemMeta(); } else if (user.isAuthorized("essentials.skull.spawn")) { itemSkull = new ItemStack(SKULL_ITEM, 1, (byte) 3); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandworth.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandworth.java index 4df511d905c..b8cca0db262 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandworth.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandworth.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.MaterialUtil; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; import org.bukkit.Server; @@ -87,7 +88,7 @@ private BigDecimal itemWorth(final CommandSource sender, final User user, final } final BigDecimal result = worth.multiply(BigDecimal.valueOf(amount)); - sender.sendMessage(is.getDurability() != 0 ? tl("worthMeta", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), is.getDurability(), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess)) : tl("worth", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess))); + sender.sendMessage(MaterialUtil.getDamage(is) != 0 ? tl("worthMeta", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), MaterialUtil.getDamage(is), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess)) : tl("worth", is.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""), NumberUtil.displayCurrency(result, ess), amount, NumberUtil.displayCurrency(worth, ess))); return result; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java index 2e8c7e0b40e..302c98e7c07 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java @@ -23,6 +23,7 @@ import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.plugin.Plugin; import org.bukkit.potion.Potion; @@ -279,12 +280,22 @@ public String serialize(final ItemStack is, final boolean useResolvers) { serializeEffectMeta(sb, fireworkEffectMeta.getEffect()); } } else if (MaterialUtil.isPotion(material)) { - final Potion potion = Potion.fromDamage(is.getDurability()); - for (final PotionEffect e : potion.getEffects()) { + final boolean splash; + final Collection effects; + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + final Potion potion = Potion.fromDamage(is.getDurability()); + splash = potion.isSplash(); + effects = potion.getEffects(); + } else { + splash = is.getType() == Material.SPLASH_POTION; + effects = ((PotionMeta) is.getItemMeta()).getCustomEffects(); + } + + for (final PotionEffect e : effects) { // long but needs to be effect:speed power:2 duration:120 in that order. - sb.append("splash:").append(potion.isSplash()).append(" ").append("effect:").append(e.getType().getName().toLowerCase()).append(" ").append("power:").append(e.getAmplifier()).append(" ").append("duration:").append(e.getDuration() / 20).append(" "); + sb.append("splash:").append(splash).append(" ").append("effect:").append(e.getType().getName().toLowerCase()).append(" ").append("power:").append(e.getAmplifier()).append(" ").append("duration:").append(e.getDuration() / 20).append(" "); } - } else if (MaterialUtil.isPlayerHead(material, is.getData().getData())) { + } else if (MaterialUtil.isPlayerHead(is)) { // item stack with meta final SkullMeta skullMeta = (SkullMeta) is.getItemMeta(); if (skullMeta != null && skullMeta.hasOwner()) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java index d6e5fe4e335..2af7b759b85 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.Trade.OverflowType; import com.earth2me.essentials.Trade.TradeType; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.MaterialUtil; import com.earth2me.essentials.utils.NumberUtil; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; @@ -83,7 +84,7 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri private Trade rechargeSign(final ISign sign, final IEssentials ess, final User player) throws SignException, ChargeException { final Trade trade = getTrade(sign, 2, AmountType.COST, false, true, ess); - if (trade.getItemStack() != null && player.getBase().getItemInHand() != null && trade.getItemStack().getType() == player.getBase().getItemInHand().getType() && trade.getItemStack().getDurability() == player.getBase().getItemInHand().getDurability() && trade.getItemStack().getEnchantments().equals(player.getBase().getItemInHand().getEnchantments())) { + if (trade.getItemStack() != null && player.getBase().getItemInHand() != null && trade.getItemStack().getType() == player.getBase().getItemInHand().getType() && MaterialUtil.getDamage(trade.getItemStack()) == MaterialUtil.getDamage(player.getBase().getItemInHand()) && trade.getItemStack().getEnchantments().equals(player.getBase().getItemInHand().getEnchantments())) { final int amount = trade.getItemStack().getAmount(); if (player.getBase().getInventory().containsAtLeast(trade.getItemStack(), amount)) { final ItemStack stack = player.getBase().getItemInHand().clone(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java index b418d568bb8..88d1196ef09 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java @@ -3,6 +3,8 @@ import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.material.MaterialData; import java.lang.reflect.InvocationTargetException; @@ -11,7 +13,6 @@ import java.util.Set; public final class MaterialUtil { - public static final Material SPAWNER = EnumUtil.getMaterial("MOB_SPAWNER", "SPAWNER"); private static final Set BEDS; private static final Set BANNERS; @@ -32,6 +33,8 @@ public final class MaterialUtil { private static final Set LEGGINGS; private static final Set BOOTS; + private static final boolean PRE_FLATTEN = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); + static { HELMETS = EnumUtil.getAllMatching(Material.class, "LEATHER_HELMET", "CHAINMAIL_HELMET", "IRON_HELMET", "GOLD_HELMET", "GOLDEN_HELMET", "DIAMOND_HELMET", "NETHERITE_HELMET", "TURTLE_HELMET"); @@ -129,20 +132,12 @@ public static boolean isLeatherArmor(final Material material) { return LEATHER_ARMOR.contains(material); } - public static boolean isMobHead(final Material material, final int durability) { - if (MOB_HEADS.contains(material)) { - return true; - } - - return LEGACY_SKULLS.contains(material) && (durability != 3); - } - - public static boolean isPlayerHead(final Material material, final int durability) { - if (PLAYER_HEADS.contains(material)) { + public static boolean isPlayerHead(final ItemStack stack) { + if (PLAYER_HEADS.contains(stack.getType())) { return true; } - return LEGACY_SKULLS.contains(material) && durability == 3; + return VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01) && LEGACY_SKULLS.contains(stack.getType()) && stack.getDurability() == 3; } public static boolean isPotion(final Material material) { @@ -166,13 +161,35 @@ public static boolean isSign(final Material material) { } public static boolean isSkull(final Material material) { - return isPlayerHead(material, -1) || isMobHead(material, -1); + return PLAYER_HEADS.contains(material) || LEGACY_SKULLS.contains(material); } public static boolean isAir(final Material material) { return material == Material.AIR || (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01) && material.isAir()); } + public static int getDamage(final ItemStack stack) { + if (PRE_FLATTEN) { + return stack.getDurability(); + } + if (stack.getItemMeta() instanceof Damageable) { + return ((Damageable) stack.getItemMeta()).getDamage(); + } + return 0; + } + + public static void setDamage(final ItemStack stack, final int damage) { + if (PRE_FLATTEN) { + stack.setDurability((short) damage); + } else { + if (stack.getItemMeta() instanceof Damageable) { + final Damageable damageable = (Damageable) stack.getItemMeta(); + damageable.setDamage(damage); + stack.setItemMeta(damageable); + } + } + } + public static Material convertFromLegacy(final int id, final byte damage) { for (final Material material : EnumSet.allOf(Material.class)) { if (material.getId() == id) { diff --git a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java index 97f0b76759d..09a9d43a828 100644 --- a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java +++ b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java @@ -69,7 +69,23 @@ private boolean metaPermCheck(final User user, final String action, final Block } return false; } - return metaPermCheck(user, action, block.getType(), block.getData()); + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + return metaPermCheck(user, action, block.getType(), block.getData()); + } + return metaPermCheck(user, action, block.getType()); + } + + private boolean metaPermCheck(final User user, final String action, final ItemStack item) { + if (item == null) { + if (ess.getSettings().isDebug()) { + logger.log(Level.INFO, "AntiBuild permission check failed, invalid item."); + } + return false; + } + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + return metaPermCheck(user, action, item.getType(), item.getDurability()); + } + return metaPermCheck(user, action, item.getType()); } public boolean metaPermCheck(final User user, final String action, final Material material) { @@ -322,7 +338,7 @@ public void onPlayerInteract(final PlayerInteractEvent event) { } if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { - if (event.hasItem() && !metaPermCheck(user, "interact", item.getType(), item.getDurability())) { + if (event.hasItem() && !metaPermCheck(user, "interact", item)) { event.setCancelled(true); if (ess.getSettings().warnOnBuildDisallow()) { user.sendMessage(tl("antiBuildUse", item.getType().toString())); @@ -347,7 +363,7 @@ public void onCraftItemEvent(final CraftItemEvent event) { final ItemStack item = event.getRecipe().getResult(); if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { - if (!metaPermCheck(user, "craft", item.getType(), item.getDurability())) { + if (!metaPermCheck(user, "craft", item)) { event.setCancelled(true); if (ess.getSettings().warnOnBuildDisallow()) { user.sendMessage(tl("antiBuildCraft", item.getType().toString())); @@ -364,7 +380,7 @@ public void onPlayerDropItem(final PlayerDropItemEvent event) { final ItemStack item = event.getItemDrop().getItemStack(); if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { - if (!metaPermCheck(user, "drop", item.getType(), item.getDurability())) { + if (!metaPermCheck(user, "drop", item)) { event.setCancelled(true); user.getBase().updateInventory(); if (ess.getSettings().warnOnBuildDisallow()) { @@ -391,7 +407,7 @@ public void onPlayerPickupItem(final EntityPickupItemEvent event) { final ItemStack item = event.getItem().getItemStack(); if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { - if (!metaPermCheck(user, "pickup", item.getType(), item.getDurability())) { + if (!metaPermCheck(user, "pickup", item)) { event.setCancelled(true); } } @@ -406,7 +422,7 @@ public void onPlayerPickupItem(final PlayerPickupItemEvent event) { final ItemStack item = event.getItem().getItemStack(); if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { - if (!metaPermCheck(user, "pickup", item.getType(), item.getDurability())) { + if (!metaPermCheck(user, "pickup", item)) { event.setCancelled(true); } } From a54eacac656223106f013fe8c42b45e1fea509e4 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:13:06 -0500 Subject: [PATCH 2/3] Few things --- .../java/com/earth2me/essentials/commands/Commandrepair.java | 2 +- .../main/java/com/earth2me/essentials/utils/MaterialUtil.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java index c21fd603385..9c0d1b83434 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java @@ -40,7 +40,7 @@ public void run(final Server server, final User user, final String commandLabel, public void repairHand(final User user) throws Exception { final ItemStack item = user.getItemInHand(); - if (item == null || item.getType().isBlock() || (MaterialUtil.getDamage(item) == 0)) { + if (item == null || item.getType().isBlock() || MaterialUtil.getDamage(item) == 0) { throw new Exception(tl("repairInvalidType")); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java index 88d1196ef09..78349577ada 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java @@ -137,7 +137,7 @@ public static boolean isPlayerHead(final ItemStack stack) { return true; } - return VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01) && LEGACY_SKULLS.contains(stack.getType()) && stack.getDurability() == 3; + return PRE_FLATTEN && LEGACY_SKULLS.contains(stack.getType()) && stack.getDurability() == 3; } public static boolean isPotion(final Material material) { From 7231bcb796419d13ad6ce213efc58f1799ccae6c Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Wed, 29 Dec 2021 10:12:07 -0500 Subject: [PATCH 3/3] Make VersionUtil.PRE_FLATTENING constant --- .../src/main/java/com/earth2me/essentials/Trade.java | 4 ++-- .../src/main/java/com/earth2me/essentials/User.java | 2 +- .../src/main/java/com/earth2me/essentials/Worth.java | 4 ++-- .../essentials/commands/Commandclearinventory.java | 2 +- .../com/earth2me/essentials/commands/Commandcondense.java | 4 +--- .../com/earth2me/essentials/commands/Commandgive.java | 2 +- .../com/earth2me/essentials/commands/Commanditemdb.java | 2 +- .../com/earth2me/essentials/commands/Commandrecipe.java | 6 ++---- .../com/earth2me/essentials/commands/Commandrepair.java | 2 +- .../com/earth2me/essentials/commands/Commandrest.java | 2 +- .../com/earth2me/essentials/items/AbstractItemDb.java | 2 +- .../java/com/earth2me/essentials/utils/MaterialUtil.java | 8 +++----- .../java/com/earth2me/essentials/utils/VersionUtil.java | 2 ++ .../essentials/antibuild/EssentialsAntiBuildListener.java | 6 +++--- 14 files changed, 22 insertions(+), 26 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Trade.java b/Essentials/src/main/java/com/earth2me/essentials/Trade.java index 671aac893d7..aa595a0bae3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Trade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Trade.java @@ -97,7 +97,7 @@ public static void log(final String type, final String subtype, final String eve if (charge.getItemStack() != null) { sb.append(charge.getItemStack().getAmount()).append(","); sb.append(charge.getItemStack().getType()).append(","); - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { sb.append(charge.getItemStack().getDurability()); } } @@ -123,7 +123,7 @@ public static void log(final String type, final String subtype, final String eve if (pay.getItemStack() != null) { sb.append(pay.getItemStack().getAmount()).append(","); sb.append(pay.getItemStack().getType()).append(","); - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { sb.append(pay.getItemStack().getDurability()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index 039747ad133..070b064d8bb 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -318,7 +318,7 @@ public Boolean canSpawnItem(final Material material) { if (isAuthorized("essentials.itemspawn.item-all") || isAuthorized("essentials.itemspawn.item-" + name)) return true; - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { final int id = material.getId(); if (isAuthorized("essentials.itemspawn.item-" + id)) return true; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/Worth.java b/Essentials/src/main/java/com/earth2me/essentials/Worth.java index 1b2b1dd6b89..61d45323d83 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Worth.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Worth.java @@ -34,7 +34,7 @@ public BigDecimal getPrice(final IEssentials ess, final ItemStack itemStack) { final String itemname = itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { // Check for matches with data value from stack // Note that we always default to BigDecimal.ONE.negate(), equivalent to -1 result = config.getBigDecimal("worth." + itemname + "." + itemStack.getDurability(), BigDecimal.ONE.negate()); @@ -142,7 +142,7 @@ public void setPrice(final IEssentials ess, final ItemStack itemStack, final dou String path = "worth." + itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); // Spigot 1.13+ throws an exception if a 1.13+ plugin even *attempts* to do set data. - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01) && itemStack.getType().getData() == null) { + if (VersionUtil.PRE_FLATTENING && itemStack.getType().getData() == null) { // Bukkit-bug: getDurability still contains the correct value, while getData().getData() is 0. path = path + "." + itemStack.getDurability(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java index 65d49d44f37..2f98a21bdcc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandclearinventory.java @@ -130,7 +130,7 @@ protected void clearHandler(final CommandSource sender, final Player player, fin } else { for (final Item item : items) { final ItemStack stack = new ItemStack(item.getMaterial()); - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { stack.setDurability(item.getData()); } // amount -1 means all items will be cleared diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java index 4abc20e9bb6..d6c869e47e3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcondense.java @@ -154,8 +154,6 @@ private Collection getStackOnRecipeMatch(final Recipe recipe, final I return null; } - final boolean legacy = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); - boolean match = true; final Iterator iter = inputList.iterator(); while (iter.hasNext()) { @@ -164,7 +162,7 @@ private Collection getStackOnRecipeMatch(final Recipe recipe, final I iter.remove(); continue; } - if (legacy && inputSlot.getDurability() == Short.MAX_VALUE) { + if (VersionUtil.PRE_FLATTENING && inputSlot.getDurability() == Short.MAX_VALUE) { inputSlot.setDurability((short) 0); } if (!inputSlot.isSimilar(stack)) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java index cc34784b12b..981bd7cc870 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgive.java @@ -38,7 +38,7 @@ public void run(final Server server, final CommandSource sender, final String co } try { - if (args.length > 3 && VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01) && NumberUtil.isInt(args[2]) && NumberUtil.isInt(args[3])) { + if (args.length > 3 && VersionUtil.PRE_FLATTENING && NumberUtil.isInt(args[2]) && NumberUtil.isInt(args[3])) { stack.setAmount(Integer.parseInt(args[2])); stack.setDurability(Short.parseShort(args[3])); } else if (args.length > 2 && Integer.parseInt(args[2]) > 0) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java index 7eb77767a5d..e2c2a778eb0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemdb.java @@ -37,7 +37,7 @@ protected void run(final Server server, final CommandSource sender, final String String itemId = "none"; - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { itemId = itemStack.getType().getId() + ":" + itemStack.getDurability(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java index 075b29acfef..4daba50dd5c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java @@ -111,14 +111,13 @@ public void shapedRecipe(final CommandSource sender, final ShapedRecipe recipe, final InventoryView view = user.getBase().openWorkbench(null, true); final String[] recipeShape = recipe.getShape(); final Map ingredientMap = recipe.getIngredientMap(); - final boolean legacy = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); for (int j = 0; j < recipeShape.length; j++) { for (int k = 0; k < recipeShape[j].length(); k++) { final ItemStack item = ingredientMap.get(recipeShape[j].toCharArray()[k]); if (item == null) { continue; } - if (legacy && item.getDurability() == Short.MAX_VALUE) { + if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } view.getTopInventory().setItem(j * 3 + k + 1, item); @@ -158,10 +157,9 @@ public void shapelessRecipe(final CommandSource sender, final ShapelessRecipe re final User user = ess.getUser(sender.getPlayer()); user.setRecipeSee(true); final InventoryView view = user.getBase().openWorkbench(null, true); - final boolean legacy = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); for (int i = 0; i < ingredients.size(); i++) { final ItemStack item = ingredients.get(i); - if (legacy && item.getDurability() == Short.MAX_VALUE) { + if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } view.setItem(i + 1, item); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java index 9c0d1b83434..834e7a3bc6e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrepair.java @@ -124,7 +124,7 @@ private void repairItems(final ItemStack[] items, final IUser user, final List effects; - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { final Potion potion = Potion.fromDamage(is.getDurability()); splash = potion.isSplash(); effects = potion.getEffects(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java index 78349577ada..31a76f2307e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java @@ -33,8 +33,6 @@ public final class MaterialUtil { private static final Set LEGGINGS; private static final Set BOOTS; - private static final boolean PRE_FLATTEN = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); - static { HELMETS = EnumUtil.getAllMatching(Material.class, "LEATHER_HELMET", "CHAINMAIL_HELMET", "IRON_HELMET", "GOLD_HELMET", "GOLDEN_HELMET", "DIAMOND_HELMET", "NETHERITE_HELMET", "TURTLE_HELMET"); @@ -137,7 +135,7 @@ public static boolean isPlayerHead(final ItemStack stack) { return true; } - return PRE_FLATTEN && LEGACY_SKULLS.contains(stack.getType()) && stack.getDurability() == 3; + return VersionUtil.PRE_FLATTENING && LEGACY_SKULLS.contains(stack.getType()) && stack.getDurability() == 3; } public static boolean isPotion(final Material material) { @@ -169,7 +167,7 @@ public static boolean isAir(final Material material) { } public static int getDamage(final ItemStack stack) { - if (PRE_FLATTEN) { + if (VersionUtil.PRE_FLATTENING) { return stack.getDurability(); } if (stack.getItemMeta() instanceof Damageable) { @@ -179,7 +177,7 @@ public static int getDamage(final ItemStack stack) { } public static void setDamage(final ItemStack stack, final int damage) { - if (PRE_FLATTEN) { + if (VersionUtil.PRE_FLATTENING) { stack.setDurability((short) damage); } else { if (stack.getItemMeta() instanceof Damageable) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java index 710e7a1723c..d9e4f9c0204 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java @@ -38,6 +38,8 @@ public final class VersionUtil { private static final Set supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_1_R01); + public static final boolean PRE_FLATTENING = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); + private static final Map unsupportedServerClasses; static { diff --git a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java index 09a9d43a828..07f47153a27 100644 --- a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java +++ b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java @@ -69,7 +69,7 @@ private boolean metaPermCheck(final User user, final String action, final Block } return false; } - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { return metaPermCheck(user, action, block.getType(), block.getData()); } return metaPermCheck(user, action, block.getType()); @@ -82,7 +82,7 @@ private boolean metaPermCheck(final User user, final String action, final ItemSt } return false; } - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { return metaPermCheck(user, action, item.getType(), item.getDurability()); } return metaPermCheck(user, action, item.getType()); @@ -97,7 +97,7 @@ private boolean metaPermCheck(final User user, final String action, final Materi final String blockPerm = "essentials.build." + action + "." + material; final String dataPerm = blockPerm + ":" + data; - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + if (VersionUtil.PRE_FLATTENING) { if (user.getBase().isPermissionSet(dataPerm)) { return user.isAuthorized(dataPerm); } else {