Added support for anvil rework cost

This commit is contained in:
Auxilor 2020-11-01 12:23:14 +00:00
parent 75c0133c5d
commit 99e9cd9303
10 changed files with 201 additions and 7 deletions

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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());
}
}

View File

@ -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("");

View File

@ -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);
}
}

View File

@ -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<Integer> 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();
}

View File

@ -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));
}
}

View File

@ -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