From 99e9cd9303ae4b4a96598b83f7df3e2bd8668883 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sun, 1 Nov 2020 12:23:14 +0000 Subject: [PATCH] Added support for anvil rework cost --- .../nms/API/RepairCostWrapper.java | 12 ++++++ .../ecoenchants/v1_15_R1/RepairCost.java | 20 ++++++++++ .../ecoenchants/v1_16_R1/RepairCost.java | 20 ++++++++++ .../ecoenchants/v1_16_R2/RepairCost.java | 26 +++++++++++++ .../support/merging/anvil/AnvilListeners.java | 39 +++++++++++++++---- .../com/willfp/ecoenchants/loader/Loader.java | 9 +++++ .../willfp/ecoenchants/nms/RepairCost.java | 35 +++++++++++++++++ .../ecoenchants/util/EcoBukkitRunnable.java | 37 ++++++++++++++++++ .../willfp/ecoenchants/util/NumberUtils.java | 9 +++++ Plugin/src/main/resources/config.yml | 1 + 10 files changed, 201 insertions(+), 7 deletions(-) create mode 100644 NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/RepairCostWrapper.java create mode 100644 NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/RepairCost.java create mode 100644 NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/RepairCost.java create mode 100644 NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/RepairCost.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/nms/RepairCost.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/util/EcoBukkitRunnable.java diff --git a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/RepairCostWrapper.java b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/RepairCostWrapper.java new file mode 100644 index 00000000..7c41b9a1 --- /dev/null +++ b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/API/RepairCostWrapper.java @@ -0,0 +1,12 @@ +package com.willfp.ecoenchants.nms.API; + +import org.bukkit.inventory.ItemStack; + +/** + * NMS Interface for getting/setting anvil repair cost + */ +public interface RepairCostWrapper { + ItemStack setRepairCost(ItemStack itemStack, int cost); + + int getRepairCost(ItemStack itemStack); +} diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/RepairCost.java b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/RepairCost.java new file mode 100644 index 00000000..80140daf --- /dev/null +++ b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/v1_15_R1/RepairCost.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.v1_15_R1; + +import com.willfp.ecoenchants.nms.API.RepairCostWrapper; +import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; + +public class RepairCost implements RepairCostWrapper { + @Override + public ItemStack setRepairCost(ItemStack itemStack, int cost) { + net.minecraft.server.v1_15_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + nmsStack.setRepairCost(cost); + return CraftItemStack.asBukkitCopy(nmsStack); + } + + @Override + public int getRepairCost(ItemStack itemStack) { + net.minecraft.server.v1_15_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + return nmsStack.getRepairCost(); + } +} \ No newline at end of file diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/RepairCost.java b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/RepairCost.java new file mode 100644 index 00000000..ac84a242 --- /dev/null +++ b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/RepairCost.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.v1_16_R1; + +import com.willfp.ecoenchants.nms.API.RepairCostWrapper; +import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; + +public class RepairCost implements RepairCostWrapper { + @Override + public ItemStack setRepairCost(ItemStack itemStack, int cost) { + net.minecraft.server.v1_16_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + nmsStack.setRepairCost(cost); + return CraftItemStack.asBukkitCopy(nmsStack); + } + + @Override + public int getRepairCost(ItemStack itemStack) { + net.minecraft.server.v1_16_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + return nmsStack.getRepairCost(); + } +} \ No newline at end of file diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/RepairCost.java b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/RepairCost.java new file mode 100644 index 00000000..5a0e6b1c --- /dev/null +++ b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/v1_16_R2/RepairCost.java @@ -0,0 +1,26 @@ +package com.willfp.ecoenchants.v1_16_R2; + +import com.willfp.ecoenchants.nms.API.RepairCostWrapper; +import com.willfp.ecoenchants.nms.API.TridentStackWrapper; +import net.minecraft.server.v1_16_R2.EntityThrownTrident; +import net.minecraft.server.v1_16_R2.NBTTagCompound; +import net.minecraft.server.v1_16_R2.NBTTagInt; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftTrident; +import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; +import org.bukkit.entity.Trident; +import org.bukkit.inventory.ItemStack; + +public class RepairCost implements RepairCostWrapper { + @Override + public ItemStack setRepairCost(ItemStack itemStack, int cost) { + net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + nmsStack.setRepairCost(cost); + return CraftItemStack.asBukkitCopy(nmsStack); + } + + @Override + public int getRepairCost(ItemStack itemStack) { + net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + return nmsStack.getRepairCost(); + } +} \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java index 14ec13a1..9de01680 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/support/merging/anvil/AnvilListeners.java @@ -1,6 +1,12 @@ package com.willfp.ecoenchants.enchantments.support.merging.anvil; import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.config.ConfigManager; +import com.willfp.ecoenchants.enchantments.EcoEnchant; +import com.willfp.ecoenchants.nms.RepairCost; +import com.willfp.ecoenchants.util.EcoBukkitRunnable; +import com.willfp.ecoenchants.util.Logger; +import com.willfp.ecoenchants.util.NumberUtils; import com.willfp.ecoenchants.util.tuplets.Pair; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -10,6 +16,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; public class AnvilListeners implements Listener { @@ -41,12 +48,30 @@ public class AnvilListeners implements Listener { modCost = newOut.getSecond(); } - Bukkit.getScheduler().runTask(EcoEnchantsPlugin.getInstance(), () -> { - final int cost = modCost + event.getInventory().getRepairCost(); - event.getInventory().setRepairCost(cost); - event.setResult(newOut.getFirst()); - event.getInventory().setItem(2, newOut.getFirst()); - player.updateInventory(); - }); + new EcoBukkitRunnable(player.getLocation().hashCode()) { + @Override + public void onRun() { + Logger.info("ID: " + this.getEcoID()); + + int preCost = event.getInventory().getRepairCost(); + ItemStack item = newOut.getFirst(); + + if(ConfigManager.getConfig().getBool("anvil.rework-cost")) { + int repairCost = RepairCost.getRepairCost(item); + int reworkCount = NumberUtils.log2(repairCost + 1); + if (repairCost == 0) reworkCount = 0; + reworkCount++; + repairCost = (int) Math.pow(2, reworkCount) - 1; + item = RepairCost.setRepairCost(item, repairCost); + } + + int cost = preCost + modCost; + + event.getInventory().setRepairCost(cost); + event.setResult(item); + event.getInventory().setItem(2, item); + player.updateInventory(); + } + }.runTask(EcoEnchantsPlugin.getInstance()); } } \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java index 038fd7d3..13645f21 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java @@ -41,6 +41,7 @@ import com.willfp.ecoenchants.listeners.ArrowListeners; import com.willfp.ecoenchants.listeners.PlayerJoinListener; import com.willfp.ecoenchants.nms.BlockBreak; import com.willfp.ecoenchants.nms.Cooldown; +import com.willfp.ecoenchants.nms.RepairCost; import com.willfp.ecoenchants.nms.TridentStack; import com.willfp.ecoenchants.util.Logger; import com.willfp.ecoenchants.util.UpdateChecker; @@ -124,6 +125,14 @@ public class Loader { Logger.error("§cAborting..."); Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance()); } + + if(RepairCost.init()) { + Logger.info("Repair Cost: §aSUCCESS"); + } else { + Logger.info("Repair Cost: §cFAILURE"); + Logger.error("§cAborting..."); + Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance()); + } Logger.info(""); diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/nms/RepairCost.java b/Plugin/src/main/java/com/willfp/ecoenchants/nms/RepairCost.java new file mode 100644 index 00000000..40bad7d5 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/nms/RepairCost.java @@ -0,0 +1,35 @@ +package com.willfp.ecoenchants.nms; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.nms.API.BlockBreakWrapper; +import com.willfp.ecoenchants.nms.API.RepairCostWrapper; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class RepairCost { + private static RepairCostWrapper repairCostWrapper; + + public static boolean init() { + try { + final Class class2 = Class.forName("com.willfp.ecoenchants." + EcoEnchantsPlugin.nmsVersion + ".RepairCost"); + if (RepairCostWrapper.class.isAssignableFrom(class2)) { + repairCostWrapper = (RepairCostWrapper) class2.getConstructor().newInstance(); + } + } catch (Exception e) { + e.printStackTrace(); + repairCostWrapper = null; + } + return repairCostWrapper != null; + } + + public static int getRepairCost(ItemStack itemStack) { + assert repairCostWrapper != null; + return repairCostWrapper.getRepairCost(itemStack); + } + + public static ItemStack setRepairCost(ItemStack itemStack, int cost) { + assert repairCostWrapper != null; + return repairCostWrapper.setRepairCost(itemStack, cost); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/util/EcoBukkitRunnable.java b/Plugin/src/main/java/com/willfp/ecoenchants/util/EcoBukkitRunnable.java new file mode 100644 index 00000000..fa5ec724 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/util/EcoBukkitRunnable.java @@ -0,0 +1,37 @@ +package com.willfp.ecoenchants.util; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashSet; +import java.util.Set; + +public abstract class EcoBukkitRunnable extends BukkitRunnable { + private static final Set tasks = new HashSet<>(); + + private final int ecoID; + + public EcoBukkitRunnable(int ecoID) { + this.ecoID = ecoID; + } + + public int getEcoID() { + return ecoID; + } + + @Override + public final void run() { + if(tasks.contains(this.getEcoID())) { + Bukkit.getScheduler().runTaskLater(EcoEnchantsPlugin.getInstance(), () -> { + tasks.remove(this.getEcoID()); + }, 1); + return; + } + + onRun(); + tasks.add(this.getEcoID()); + } + + public abstract void onRun(); +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java b/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java index df30dfe5..8e6a9c49 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java @@ -114,4 +114,13 @@ public class NumberUtils { return maximum - Math.sqrt((1 - rand) * (maximum - minimum) * (maximum - peak)); } } + + /** + * Get Log base 2 of a number + * @param N The number + * @return The result + */ + public static int log2(int N) { + return (int)(Math.log(N) / Math.log(2)); + } } diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index d2dbb863..64d30d1c 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -8,6 +8,7 @@ commands: show-target-group: true # Show name of target group rather than individual items anvil: + rework-cost: false # Use vanilla rework penalty allow-unsafe-levels: false # Allow unsafe enchantments like Sharpness 6 by combining 2 Sharp 5. allow-combining-unsafe: true # Allow further combining unsafe levels, eg Sharp 6 + Sharp 6 = Sharp 7. allow-existing-unsafe-levels: true # Allow combining existing unsafe enchantments like Sharpness 6