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;
|
package com.willfp.ecoenchants.enchantments.support.merging.anvil;
|
||||||
|
|
||||||
import com.willfp.ecoenchants.EcoEnchantsPlugin;
|
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 com.willfp.ecoenchants.util.tuplets.Pair;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -10,6 +16,7 @@ import org.bukkit.event.EventPriority;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
public class AnvilListeners implements Listener {
|
public class AnvilListeners implements Listener {
|
||||||
|
|
||||||
@ -41,12 +48,30 @@ public class AnvilListeners implements Listener {
|
|||||||
modCost = newOut.getSecond();
|
modCost = newOut.getSecond();
|
||||||
}
|
}
|
||||||
|
|
||||||
Bukkit.getScheduler().runTask(EcoEnchantsPlugin.getInstance(), () -> {
|
new EcoBukkitRunnable(player.getLocation().hashCode()) {
|
||||||
final int cost = modCost + event.getInventory().getRepairCost();
|
@Override
|
||||||
event.getInventory().setRepairCost(cost);
|
public void onRun() {
|
||||||
event.setResult(newOut.getFirst());
|
Logger.info("ID: " + this.getEcoID());
|
||||||
event.getInventory().setItem(2, newOut.getFirst());
|
|
||||||
player.updateInventory();
|
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.listeners.PlayerJoinListener;
|
||||||
import com.willfp.ecoenchants.nms.BlockBreak;
|
import com.willfp.ecoenchants.nms.BlockBreak;
|
||||||
import com.willfp.ecoenchants.nms.Cooldown;
|
import com.willfp.ecoenchants.nms.Cooldown;
|
||||||
|
import com.willfp.ecoenchants.nms.RepairCost;
|
||||||
import com.willfp.ecoenchants.nms.TridentStack;
|
import com.willfp.ecoenchants.nms.TridentStack;
|
||||||
import com.willfp.ecoenchants.util.Logger;
|
import com.willfp.ecoenchants.util.Logger;
|
||||||
import com.willfp.ecoenchants.util.UpdateChecker;
|
import com.willfp.ecoenchants.util.UpdateChecker;
|
||||||
@ -124,6 +125,14 @@ public class Loader {
|
|||||||
Logger.error("§cAborting...");
|
Logger.error("§cAborting...");
|
||||||
Bukkit.getPluginManager().disablePlugin(EcoEnchantsPlugin.getInstance());
|
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("");
|
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));
|
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
|
show-target-group: true # Show name of target group rather than individual items
|
||||||
|
|
||||||
anvil:
|
anvil:
|
||||||
|
rework-cost: false # Use vanilla rework penalty
|
||||||
allow-unsafe-levels: false # Allow unsafe enchantments like Sharpness 6 by combining 2 Sharp 5.
|
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-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
|
allow-existing-unsafe-levels: true # Allow combining existing unsafe enchantments like Sharpness 6
|
||||||
|
Loading…
Reference in New Issue
Block a user