mirror of
https://github.com/Auxilor/EcoEnchants.git
synced 2025-02-27 06:21:59 +01:00
Added support for anvil rework cost
This commit is contained in:
parent
75c0133c5d
commit
99e9cd9303
@ -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);
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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("");
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user