groups) {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAClickResultBypassEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAClickResultBypassEvent.java
index fe5e199..a27c65e 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAClickResultBypassEvent.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAClickResultBypassEvent.java
@@ -17,7 +17,7 @@ import org.jetbrains.annotations.NotNull;
* Most of the time you would likely need {@link CAPreAnvilBypassEvent} or {@link CAEarlyPreAnvilBypassEvent}
* for this event to be useful.
*
- * There is also {@link CATreatAnvilResult2Event} that may be better for some use case.
+ * There is also {@link CATreatAnvilResultEvent} that may be better for some use case.
*/
public class CAClickResultBypassEvent extends Event implements Cancellable {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAEarlyPreAnvilBypassEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAEarlyPreAnvilBypassEvent.java
index e92b4cd..2fbd275 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAEarlyPreAnvilBypassEvent.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAEarlyPreAnvilBypassEvent.java
@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull;
*
* You should also use {@link CAClickResultBypassEvent} if you want to use this event for something useful.
*
- * It is also recommended that you read about {@link CAPreAnvilBypassEvent} and {@link CATreatAnvilResult2Event}
+ * It is also recommended that you read about {@link CAPreAnvilBypassEvent} and {@link CATreatAnvilResultEvent}
* as your use case may be more prone to use theses.
*/
public class CAEarlyPreAnvilBypassEvent extends Event implements Cancellable {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAPreAnvilBypassEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAPreAnvilBypassEvent.java
index 9103a4b..18334e3 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAPreAnvilBypassEvent.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAPreAnvilBypassEvent.java
@@ -18,7 +18,7 @@ import org.jetbrains.annotations.NotNull;
*
* You should also use {@link CAClickResultBypassEvent} if you want to use this event for something useful.
*
- * It is also recommended that you read about {@link CAEarlyPreAnvilBypassEvent} and {@link CATreatAnvilResult2Event}
+ * It is also recommended that you read about {@link CAEarlyPreAnvilBypassEvent} and {@link CATreatAnvilResultEvent}
* as your use case may be more prone to use theses.
*/
public class CAPreAnvilBypassEvent extends Event implements Cancellable {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResult2Event.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResult2Event.java
deleted file mode 100644
index 30c5380..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResult2Event.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package xyz.alexcrea.cuanvil.api.event.listener;
-
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryView;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.ApiStatus;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import xyz.alexcrea.cuanvil.anvil.AnvilCost;
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
-
-/**
- * Called after custom anvil processed the click on the result on the anvil inventory.
- * This event should be used to modify the result of an anvil use.
- *
- * You may also want to check {@link CAClickResultBypassEvent},
- * {@link CAPreAnvilBypassEvent}
- * and {@link CAEarlyPreAnvilBypassEvent} for your use case
- *
- * A null result will cancel this event
- */
-@SuppressWarnings("unused")
-public class CATreatAnvilResult2Event extends Event {
-
- private static final HandlerList HANDLERS = new HandlerList();
-
- public static HandlerList getHandlerList() {
- return HANDLERS;
- }
-
- @Override
- public @NotNull HandlerList getHandlers() {
- return HANDLERS;
- }
-
- @NotNull
- private final InventoryView view;
-
- private final AnvilUseType useType;
-
- @Nullable
- private final ItemStack left;
- @Nullable
- private final ItemStack right;
-
- @Nullable
- private ItemStack result;
-
- private final AnvilCost cost;
-
- @ApiStatus.Internal
- public CATreatAnvilResult2Event(
- @NotNull InventoryView view,
- Inventory inv,
- AnvilUseType useType,
- @Nullable ItemStack result,
- AnvilCost cost) {
- this.view = view;
- this.useType = useType;
-
- this.left = inv.getItem(0); // TODO use view here
- this.right = inv.getItem(1);
- this.result = result;
- this.cost = cost;
- }
-
- /**
- * Get the bukkit inventory view.
- *
- * Temporarily marked as internal as it will get changed to anvil view on legacy removal
- * so signature will change
- *
- * @return The inventory view of this event.
- */
- @ApiStatus.Internal
- public @NotNull InventoryView getView() {
- return view;
- }
-
-
- /**
- * Get the type of use source of the result.
- *
- * @return The craft use type.
- */
- public AnvilUseType getUseType() {
- return useType;
- }
-
- /**
- * Get the left item of the anvil use
- *
- * @return the left item
- */
- public @Nullable ItemStack getLeftItem() {
- return left;
- }
-
- /**
- * Get the right item of the anvil use
- *
- * @return the right item
- */
- public @Nullable ItemStack getRightItem() {
- return right;
- }
-
- /**
- * Get the current result
- *
- * note that it will not be null unless another listener previously set it to null.
- *
- * @return The current result.
- */
- public @Nullable ItemStack getResult() {
- return result;
- }
-
- /**
- * Set the current result
- *
- * note that a null result will cancel this anvil use.
- *
- * @param result The new result
- */
- public void setResult(@Nullable ItemStack result) {
- this.result = result;
- }
-
- /**
- * Get the level cost displayed on the anvil.
- *
Important note:
- * the final price are re calculated on click for the following use case:
- *
- * - Custom craft
- * - Unit repair
- * - Lore edit
- *
- * This value will be used as final price for:
- * Item merge
- * Item rename
- *
- *
- * @return The current cost.
- * @deprecated use #{@link #getCost()} instead
- */
- @Deprecated(forRemoval = true, since = "1.17.0")
- public int getLevelCost() {
- return cost.asXpCost();
- }
-
- /**
- * Set the level cost displayed on the anvil.
- * Important note:
- * the final price are re calculated on click for the following use case:
- *
- * - Custom craft
- * - Unit repair
- * - Lore edit
- *
- * This value will be used as final price for:
- * Item merge
- * Item rename
- *
- *
- * @param levelCost The new cost.
- * @deprecated use #{@link #getCost()} and set value on this instead
- */
- @Deprecated(forRemoval = true, since = "1.17.0")
- public void setLevelCost(int levelCost) {
- cost.setGeneric(levelCost - cost.getGeneric() - cost.asXpCost());
- }
-
- /**
- * Allow access to the current cost of the event
- * Note that modifying this object will change the event resulting cost
- *
- * Important note:
- * the final price are re calculated on click for the following use case:
- *
- * - Custom craft
- * - Unit repair
- * - Lore edit
- *
- * This value will be used as final price for:
- * Item merge
- * Item rename
- *
- * @return the current anvil cost
- */
- public AnvilCost getCost() {
- return cost;
- }
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java
index 80965b5..1675d1a 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java
@@ -6,8 +6,7 @@ import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import xyz.alexcrea.cuanvil.anvil.AnvilCost;
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
+import xyz.alexcrea.cuanvil.util.AnvilUseType;
/**
* Called after custom anvil processed the click on the result on the anvil inventory.
@@ -18,12 +17,8 @@ import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
* and {@link CAEarlyPreAnvilBypassEvent} for your use case
*
* A null result will cancel this pre anvil event
- *
- * @deprecated Prepare anvil Event cannot be provided as it can be called on result and therefore not have prepared anvil event
- * use {@link CATreatAnvilResult2Event} instead
*/
@SuppressWarnings("unused")
-@Deprecated(forRemoval = true, since = "1.17.0")
public class CATreatAnvilResultEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList();
@@ -45,13 +40,13 @@ public class CATreatAnvilResultEvent extends Event {
@Nullable
private ItemStack result;
- private final AnvilCost cost;
+ private int levelCost;
- public CATreatAnvilResultEvent(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, AnvilCost cost) {
+ public CATreatAnvilResultEvent(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, int levelCost) {
this.event = event;
this.useType = useType;
this.result = result;
- this.cost = cost;
+ this.levelCost = levelCost;
}
/**
@@ -109,11 +104,9 @@ public class CATreatAnvilResultEvent extends Event {
*
*
* @return The current cost.
- * @deprecated use #{@link #getCost()} instead
*/
- @Deprecated(forRemoval = true, since = "1.17.0")
public int getLevelCost() {
- return cost.asXpCost();
+ return levelCost;
}
/**
@@ -131,32 +124,8 @@ public class CATreatAnvilResultEvent extends Event {
*
*
* @param levelCost The new cost.
- * @deprecated use #{@link #getCost()} and set value on this instead
*/
- @Deprecated(forRemoval = true, since = "1.17.0")
public void setLevelCost(int levelCost) {
- cost.setGeneric(levelCost - cost.getGeneric() - cost.asXpCost());
+ this.levelCost = levelCost;
}
-
- /**
- * Allow access to the current cost of the event
- * Note that modifying this object will change the event resulting cost
- *
- *
Important note:
- * the final price are re calculated on click for the following use case:
- *
- * - Custom craft
- * - Unit repair
- * - Lore edit
- *
- * This value will be used as final price for:
- * Item merge
- * Item rename
- *
- * @return the current anvil cost
- */
- public AnvilCost getCost() {
- return cost;
- }
-
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java b/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java
index f6a7e80..2037e23 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/config/ConfigHolder.java
@@ -9,7 +9,6 @@ import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.group.EnchantConflictManager;
import xyz.alexcrea.cuanvil.group.ItemGroupManager;
import xyz.alexcrea.cuanvil.recipe.CustomAnvilRecipeManager;
-import xyz.alexcrea.cuanvil.util.MetricsUtil;
import java.io.File;
import java.io.IOException;
@@ -146,7 +145,6 @@ public abstract class ConfigHolder {
sufficientSuccess = true;
} catch (IOException e) {
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not copy backup saving config " + base.getName(), e);
- MetricsUtil.INSTANCE.trackError(e);
}
}
// save last backup
@@ -277,7 +275,6 @@ public abstract class ConfigHolder {
this.deletedConfigFile.createNewFile();
} catch (IOException e) {
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not create " + this.deletedConfigFile.getPath(), e);
- MetricsUtil.INSTANCE.trackError(e);
}
loadDeletedListFile(false);
@@ -315,7 +312,6 @@ public abstract class ConfigHolder {
this.deletedListConfig.save(this.deletedConfigFile);
} catch (IOException e) {
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not save " + this.deletedConfigFile.getPath(), e);
- MetricsUtil.INSTANCE.trackError(e);
return false;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/config/WorkPenaltyType.java b/src/main/java/xyz/alexcrea/cuanvil/config/WorkPenaltyType.java
index d374999..75b0861 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/config/WorkPenaltyType.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/config/WorkPenaltyType.java
@@ -2,7 +2,7 @@ package xyz.alexcrea.cuanvil.config;
import com.google.common.collect.ImmutableMap;
import org.jetbrains.annotations.Nullable;
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
+import xyz.alexcrea.cuanvil.util.AnvilUseType;
import java.util.EnumMap;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/AdditionalTestEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/AdditionalTestEnchantment.java
index 821838f..832e5af 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/AdditionalTestEnchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/AdditionalTestEnchantment.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.enchant;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -12,23 +11,24 @@ public interface AdditionalTestEnchantment {
/**
* Test if the provided enchantments can be compatible with this enchantment. only non-Custom Anvil conflict.
* @param enchantments Immutable map of validated enchantments for the item.
- * @param itemType Material namespaced key of the tested item.
+ * @param itemMat Material of the tested item.
* @return If there is a conflict with the enchantments.
*/
boolean isEnchantConflict(
@NotNull Map enchantments,
- @NotNull NamespacedKey itemType);
+ @NotNull Material itemMat);
+
/**
* Test if the provided item can be compatible with this enchantment. only non-Custom Anvil conflict.
* @param enchantments Immutable map of validated enchantments for the item.
- * @param itemType Material namespaced key of the tested item.
+ * @param itemMat Material of the tested item.
* @param item Provide a new instance of the used item stack with the partial enchantment applied.
* @return If there is a conflict with the enchantment and the item.
*/
boolean isItemConflict(
@NotNull Map enchantments,
- @NotNull NamespacedKey itemType,
+ @NotNull Material itemMat,
@NotNull ItemStack item);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java
index 854ed55..4634a11 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java
@@ -10,7 +10,6 @@ import xyz.alexcrea.cuanvil.enchant.bulk.BukkitEnchantBulkOperation;
import xyz.alexcrea.cuanvil.enchant.bulk.BulkCleanEnchantOperation;
import xyz.alexcrea.cuanvil.enchant.bulk.BulkGetEnchantOperation;
import xyz.alexcrea.cuanvil.enchant.wrapped.CABukkitEnchantment;
-import xyz.alexcrea.cuanvil.util.MetricsUtil;
import java.util.*;
import java.util.logging.Level;
@@ -86,13 +85,11 @@ public class CAEnchantmentRegistry {
return false;
}
- var error = new IllegalStateException("enchantment " + enchantment.getKey() + " was already registered");
CustomAnvil.instance.getLogger().log(Level.WARNING,
"Duplicate distinct registered enchantment. This should NOT happen any time.\n" +
"If you are a custom anvil developer: Maybe custom anvil detected your enchantment as a bukkit enchantment. " +
"you should maybe remove enchantment with the same key before registering yours",
- error);
- MetricsUtil.INSTANCE.trackError(error);
+ new IllegalStateException("enchantment " + enchantment.getKey() + " was already registered"));
return false;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/SuperEnchantBulkOperation.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/SuperEnchantBulkOperation.java
deleted file mode 100644
index 8bc729a..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/SuperEnchantBulkOperation.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package xyz.alexcrea.cuanvil.enchant.bulk;
-
-import com.maddoxh.superEnchants.items.EnchantApplicator;
-import com.maddoxh.superEnchants.items.EnchantReader;
-import io.delilaheve.CustomAnvil;
-import org.bukkit.NamespacedKey;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.plugin.Plugin;
-import org.jetbrains.annotations.NotNull;
-import xyz.alexcrea.cuanvil.api.EnchantmentApi;
-import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
-
-import java.util.Map;
-
-public class SuperEnchantBulkOperation implements BulkGetEnchantOperation, BulkCleanEnchantOperation {
-
- private Plugin plugin;
- public SuperEnchantBulkOperation(Plugin plugin) {
- this.plugin = plugin;
- }
-
- @Override
- public void bulkGet(@NotNull Map enchantmentMap, @NotNull ItemStack item, @NotNull ItemMeta meta) {
- EnchantReader.INSTANCE.readEnchants(item).forEach((ench, level) -> {
- var enchantment = EnchantmentApi.getByKey(NamespacedKey.fromString(ench, plugin));
- if(enchantment == null) {
- CustomAnvil.log("Enchantment " + ench + " not found in custom anvil");
- return;
- }
-
- enchantmentMap.put(enchantment, level);
- }
- );
- }
-
- @Override
- public void bulkClear(@NotNull ItemStack item) {
- EnchantApplicator.INSTANCE.clearAllCustomEnchants(item);
- }
-
- @Override
- public void bulkClear(@NotNull ItemStack item, @NotNull ItemMeta meta) {
- // item meta is not preferred for enchantment squared clear
- }
-
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java
index 783798d..d3082c9 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.enchant.wrapped;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import su.nightexpress.excellentenchants.api.enchantment.CustomEnchantment;
@@ -40,7 +39,7 @@ public class CAEEPreV5Enchantment extends CABukkitEnchantment implements Additio
}
@Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
+ public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull Material itemMat) {
if (!definition.hasConflicts()) return false;
Set conflicts = definition.getConflicts();
@@ -53,8 +52,8 @@ public class CAEEPreV5Enchantment extends CABukkitEnchantment implements Additio
}
@Override
- public boolean isItemConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) {
- if (Material.ENCHANTED_BOOK.getKey().equals(itemType)) return false;
+ public boolean isItemConflict(@NotNull Map enchantments, @NotNull Material itemMat, @NotNull ItemStack item) {
+ if (Material.ENCHANTED_BOOK.equals(itemMat)) return false;
return !definition.getSupportedItems().is(item);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5Enchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5Enchantment.java
index 2d8f945..e91930f 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5Enchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5Enchantment.java
@@ -1,51 +1,48 @@
package xyz.alexcrea.cuanvil.enchant.wrapped;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import su.nightexpress.excellentenchants.api.enchantment.CustomEnchantment;
import su.nightexpress.excellentenchants.api.item.ItemSet;
+import su.nightexpress.excellentenchants.api.wrapper.EnchantDefinition;
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment;
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
public class CAEEV5Enchantment extends CABukkitEnchantment implements AdditionalTestEnchantment {
@NotNull CustomEnchantment eeenchantment;
- @NotNull Object definition;
+ @NotNull EnchantDefinition definition;
public CAEEV5Enchantment(@NotNull CustomEnchantment enchantment) {
- super(enchantment.getBukkitEnchantment(), EnchantmentRarity.getRarity(getAnvilCost(enchantment)));
+ super(enchantment.getBukkitEnchantment(), EnchantmentRarity.getRarity(enchantment.getDefinition().getAnvilCost()));
this.eeenchantment = enchantment;
- this.definition = getDefinition(enchantment);
+ this.definition = enchantment.getDefinition();
}
@Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
- if (!hasConflicts()) return false;
+ public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull Material itemMat) {
+ if (!definition.hasConflicts()) return false;
- Set conflicts = getExclusiveSet();
+ Set conflicts = definition.getExclusiveSet();
for (CAEnchantment caEnchantment : enchantments.keySet()) {
if (conflicts.contains(caEnchantment.getName())) return true;
- if (conflicts.contains(caEnchantment.getKey().toString())) return true;
}
return false;
}
@Override
- public boolean isItemConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) {
- if (Material.ENCHANTED_BOOK.getKey().equals(itemType)) return false;
+ public boolean isItemConflict(@NotNull Map enchantments, @NotNull Material itemMat, @NotNull ItemStack item) {
+ if (Material.ENCHANTED_BOOK.equals(itemMat)) return false;
- String key = itemType.getKey();
+ String key = itemMat.getKey().getKey();
ItemSet primary = eeenchantment.getPrimaryItems();
if (primary.getMaterials().contains(key)) return false;
@@ -55,74 +52,4 @@ public class CAEEV5Enchantment extends CABukkitEnchantment implements Additional
return true;
}
-
- private static final Method getDefinitonMethod;
-
- private static final Method getAnvilCostMethod;
- private static final Method hasConflictsMethod;
- private static final Method getExclusiveSetMethod;
- static {
- var enchClazz = CustomEnchantment.class;
- try {
- getDefinitonMethod = enchClazz.getDeclaredMethod("getDefinition");
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- }
-
- Class> definitionClazz;
- try {
- definitionClazz = Class.forName("su.nightexpress.excellentenchants.api.EnchantDefinition");
- } catch (ClassNotFoundException e) {
- try {
- definitionClazz = Class.forName("su.nightexpress.excellentenchants.api.wrapper.EnchantDefinition");
- } catch (ClassNotFoundException ex) {
- throw new RuntimeException(ex);
- }
- }
-
- // Now definition methods
- try {
- getAnvilCostMethod = definitionClazz.getDeclaredMethod("getAnvilCost");
- hasConflictsMethod = definitionClazz.getDeclaredMethod("hasConflicts");
- getExclusiveSetMethod = definitionClazz.getDeclaredMethod("getExclusiveSet");
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- }
-
- }
-
- private static Object getDefinition(CustomEnchantment enchantment) {
- try {
- return getDefinitonMethod.invoke(enchantment);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- private static int getAnvilCost(CustomEnchantment enchantment) {
- try {
- return (int) getAnvilCostMethod.invoke(getDefinition(enchantment));
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- }
-
- private boolean hasConflicts() {
- try {
- return (boolean) hasConflictsMethod.invoke(definition);
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- }
-
-
- private Set getExclusiveSet() {
- try {
- return (Set) getExclusiveSetMethod.invoke(definition);
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
- }
-
-
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5_4Enchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5_4Enchantment.java
deleted file mode 100644
index 7fb8627..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5_4Enchantment.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package xyz.alexcrea.cuanvil.enchant.wrapped;
-
-import org.bukkit.NamespacedKey;
-import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.CustomEnchantment;
-import xyz.alexcrea.cuanvil.dependency.plugins.ExcellentEnchant5_4EnchantSettings;
-import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
-
-import java.util.Map;
-
-public class CAEEV5_4Enchantment extends CAEEV5Enchantment {
-
- public CAEEV5_4Enchantment(@NotNull CustomEnchantment enchantment) {
- super(enchantment);
- }
-
- @Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemMat) {
- if(super.isEnchantConflict(enchantments, itemMat)) return true;
-
- var limit = ExcellentEnchant5_4EnchantSettings.anvilLimit();
- var count = enchantments.keySet().stream()
- .filter(key -> key instanceof CAEEV5_4Enchantment)
- .count();
-
- return count > limit;
- }
-
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java
index 32d1346..6e74b73 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java
@@ -4,7 +4,6 @@ import com.willfp.ecoenchants.enchant.EcoEnchant;
import com.willfp.ecoenchants.target.EnchantmentTarget;
import com.willfp.ecoenchants.type.EnchantmentType;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment;
@@ -24,13 +23,9 @@ public class CAEcoEnchant extends CABukkitEnchantment implements AdditionalTestE
}
@Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
+ public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull Material itemMat) {
if (enchantments.isEmpty()) return false;
- // Check if there is only self
- if (enchantments.size() == 1 && this.equals(enchantments.keySet().stream().findFirst().get()))
- return false;
-
if (this.ecoEnchant.getConflictsWithEverything()) {
return true;
}
@@ -62,9 +57,9 @@ public class CAEcoEnchant extends CABukkitEnchantment implements AdditionalTestE
@Override
public boolean isItemConflict(@NotNull Map enchantments,
- @NotNull NamespacedKey itemType,
+ @NotNull Material itemMat,
@NotNull ItemStack item) {
- if (Material.ENCHANTED_BOOK.getKey().equals(itemType)) {
+ if (Material.ENCHANTED_BOOK.equals(itemMat)) {
return false;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAIncompatibleAllEnchant.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAIncompatibleAllEnchant.java
index 552ecd4..218ce87 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAIncompatibleAllEnchant.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAIncompatibleAllEnchant.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.enchant.wrapped;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -25,12 +24,12 @@ public class CAIncompatibleAllEnchant extends CABukkitEnchantment implements Add
@Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
+ public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull Material itemMat) {
return !enchantments.isEmpty() && !(enchantments.size() == 1 && enchantments.containsKey(this));
}
@Override
- public boolean isItemConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) {
+ public boolean isItemConflict(@NotNull Map enchantments, @NotNull Material itemMat, @NotNull ItemStack item) {
return false;
}
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEEEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEEEnchantment.java
index 74068d4..191f8f3 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEEEnchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEEEnchantment.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.enchant.wrapped;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
@@ -23,7 +22,7 @@ public class CALegacyEEEnchantment extends CABukkitEnchantment implements Additi
}
@Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
+ public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull Material itemMat) {
if (!eeenchantment.hasConflicts()) return false;
Set conflicts = eeenchantment.getConflicts();
@@ -36,8 +35,8 @@ public class CALegacyEEEnchantment extends CABukkitEnchantment implements Additi
}
@Override
- public boolean isItemConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) {
- if (Material.ENCHANTED_BOOK.getKey().equals(itemType)) return false;
+ public boolean isItemConflict(@NotNull Map enchantments, @NotNull Material itemMat, @NotNull ItemStack item) {
+ if (Material.ENCHANTED_BOOK.equals(itemMat)) return false;
return !eeenchantment.getSupportedItems().is(item);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEcoEnchant.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEcoEnchant.java
index cb24def..3b4242d 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEcoEnchant.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CALegacyEcoEnchant.java
@@ -4,14 +4,12 @@ import com.willfp.ecoenchants.enchantments.EcoEnchant;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentTarget;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentType;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment;
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
-import xyz.alexcrea.cuanvil.util.MaterialUtil;
import java.util.Map;
@@ -25,7 +23,7 @@ public class CALegacyEcoEnchant extends CABukkitEnchantment implements Additiona
}
@Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
+ public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull Material itemMat) {
if (enchantments.isEmpty()) return false;
EnchantmentType type = this.ecoEnchant.getType();
@@ -50,15 +48,14 @@ public class CALegacyEcoEnchant extends CABukkitEnchantment implements Additiona
@Override
public boolean isItemConflict(@NotNull Map enchantments,
- @NotNull NamespacedKey itemType,
+ @NotNull Material itemMat,
@NotNull ItemStack item) {
- if (Material.ENCHANTED_BOOK.getKey().equals(itemType)) {
+ if (Material.ENCHANTED_BOOK.equals(itemMat)) {
return false;
}
- var mat = MaterialUtil.INSTANCE.getMatFromKey(itemType);
for (EnchantmentTarget target : this.ecoEnchant.getTargets()) {
- if (target.getMaterials().contains(mat)) {
+ if (target.getMaterials().contains(itemMat)) {
return false;
}
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java
deleted file mode 100644
index 6039dc8..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CASuperEnchantEnchantment.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package xyz.alexcrea.cuanvil.enchant.wrapped;
-
-import com.maddoxh.superEnchants.enchants.CustomEnchant;
-import com.maddoxh.superEnchants.enchants.EnchantManager;
-import com.maddoxh.superEnchants.items.EnchantApplicator;
-import com.maddoxh.superEnchants.items.EnchantReader;
-import com.maddoxh.superEnchants.util.ConflictChecker;
-import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.plugin.Plugin;
-import org.jetbrains.annotations.NotNull;
-import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment;
-import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
-import xyz.alexcrea.cuanvil.enchant.CAEnchantmentBase;
-import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class CASuperEnchantEnchantment extends CAEnchantmentBase implements AdditionalTestEnchantment {
-
- private @NotNull CustomEnchant enchant;
- private @NotNull EnchantManager enchantManager;
-
- public CASuperEnchantEnchantment(@NotNull CustomEnchant enchant, @NotNull Plugin plugin, @NotNull EnchantManager enchantManager) {
- super(NamespacedKey.fromString(enchant.getId(), plugin), EnchantmentRarity.COMMON, enchant.getMaxLevel());
-
- this.enchant = enchant;
- this.enchantManager = enchantManager;
- }
-
- @Override
- public int getLevel(@NotNull ItemStack item, @NotNull ItemMeta meta) {
- return EnchantReader.INSTANCE.getEnchantLevel(item, enchant.getId());
- }
-
- @Override
- public boolean isEnchantmentPresent(@NotNull ItemStack item, @NotNull ItemMeta meta) {
- return EnchantReader.INSTANCE.hasEnchant(item, enchant.getId());
- }
-
- @Override
- public void addEnchantmentUnsafe(@NotNull ItemStack item, int level) {
- EnchantApplicator.INSTANCE.applyEnchant(item, enchant.getId(), level);
- }
-
- @Override
- public void removeFrom(@NotNull ItemStack item) {
- EnchantApplicator.INSTANCE.removeEnchant(item, enchant.getId());
- }
-
- @Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
- var idMap = new HashMap();
-
- enchantments.forEach((enchant, level) -> {
- if(!(enchant instanceof CASuperEnchantEnchantment superEnch)) return;
- idMap.put(superEnch.enchant.getId(), level);
- });
-
- return ConflictChecker.INSTANCE.hasConflict(
- idMap,
- enchant.getId(),
- enchantManager
- ) != null;
- }
-
- @Override
- public boolean isItemConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType, @NotNull ItemStack item) {
- if(Material.ENCHANTED_BOOK.equals(item.getType())) return false;
-
- return !enchant.canApplyTo(item.getType());
- }
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectMaterialContainer.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectMaterialContainer.java
index 3756341..2f76694 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectMaterialContainer.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectMaterialContainer.java
@@ -1,35 +1,34 @@
package xyz.alexcrea.cuanvil.gui.config;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
import java.util.*;
public interface SelectMaterialContainer {
- Set getSelectedMaterials();
+ EnumSet getSelectedMaterials();
- boolean setSelectedMaterials(Set materials);
+ boolean setSelectedMaterials(EnumSet materials);
- Set illegalMaterials();
+ EnumSet illegalMaterials();
static List getMaterialLore(SelectMaterialContainer container, String containerType, String action){
// Prepare material lore
ArrayList groupLore = new ArrayList<>();
groupLore.add("§7Allow you to select a list of §ematerials §7that this " + containerType + " should " + action);
- Set materialSet = container.getSelectedMaterials();
+ Set materialSet = container.getSelectedMaterials();
if (materialSet.isEmpty()) {
groupLore.add("§7There is no "+action+"d material for this "+containerType+".");
} else {
groupLore.add("§7List of "+action+"d materials for this "+containerType+":");
- Iterator materialIterator = materialSet.iterator();
+ Iterator materialIterator = materialSet.iterator();
boolean greaterThanMax = materialSet.size() > 5;
int maxindex = (greaterThanMax ? 4 : materialSet.size());
for (int i = 0; i < maxindex; i++) {
// format string like "- Stone Sword"
- String formattedName = CasedStringUtil.snakeToUpperSpacedCase(materialIterator.next().getKey().toLowerCase());
+ String formattedName = CasedStringUtil.snakeToUpperSpacedCase(materialIterator.next().name().toLowerCase());
groupLore.add("§7- §e" + formattedName);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java
index 5839663..56bf848 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java
@@ -11,7 +11,6 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
-import xyz.alexcrea.cuanvil.util.MetricsUtil;
import java.util.Arrays;
import java.util.function.Supplier;
@@ -42,7 +41,6 @@ public class ConfirmActionGui extends AbstractAskGui {
success = onConfirm.get();
} catch (Exception e) {
CustomAnvil.instance.getLogger().log(Level.WARNING, "Could not process confirmation supplier.", e);
- MetricsUtil.INSTANCE.trackError(e);
success = false;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java
index 66411bd..b2d6afe 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java
@@ -12,7 +12,6 @@ import org.jetbrains.annotations.NotNull;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
-import xyz.alexcrea.cuanvil.util.MaterialUtil;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
@@ -53,7 +52,7 @@ public class SelectItemTypeGui extends AbstractAskGui {
event.setCancelled(true);
ItemStack cursor = event.getWhoClicked().getItemOnCursor();
- if(MaterialUtil.INSTANCE.isAir(cursor)) return;
+ if(cursor.getType().isAir()) return;
ItemStack finalItem;
if(materialOnly){
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java
index 51936c7..a07cb3c 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/BasicConfigGui.java
@@ -14,7 +14,6 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil;
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager;
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui;
@@ -284,7 +283,7 @@ public class BasicConfigGui extends ChestGui implements ValueUpdatableGui {
if(!this.packetManager.getCanSetInstantBuild()){
lore.add("");
- lore.add("§4/!\\§cCaution§4/!\\ §cYou need ProtocoLib installed and working or a paper server.");
+ lore.add("§4/!\\§cCaution§4/!\\ §cYou need ProtocoLib installed and working or a newer version of this plugin for this to work.");
lore.add("§cCurrently ProtocoLib is not detected.");
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java
index e9edbeb..d624bff 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java
@@ -17,7 +17,7 @@ import java.util.Locale;
*/
public class EnchantLimitConfigGui extends AbstractEnchantConfigGui {
- private static final String SECTION_NAME = ConfigOptions.ENCHANT_LIMIT_ROOT;
+ private static final String SECTION_NAME = "enchant_limits";
private static EnchantLimitConfigGui INSTANCE = null;
@@ -41,34 +41,18 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui "Default (" + defaultValue + ")";
- case RESET -> String.valueOf(defaultValue);
- default -> "Default";
- };
-
- }
- else return super.valueDisplayName(type, value);
+ return ConfigOptions.INSTANCE.enchantLimit(enchant);
}
};
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java
index 97bdfcb..99bba84 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java
@@ -25,7 +25,6 @@ import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
-import xyz.alexcrea.cuanvil.util.MetricsUtil;
import java.util.*;
import java.util.function.Supplier;
@@ -265,7 +264,6 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
updateGuiValues();
} catch (Exception e) {
CustomAnvil.instance.getLogger().log(Level.WARNING, "An error occurred while updating enchants for " + this.enchantConflict, e);
- MetricsUtil.INSTANCE.trackError(e);
}
// Save file configuration to disk
@@ -310,7 +308,6 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
updateGuiValues();
} catch (Exception e) {
CustomAnvil.instance.getLogger().log(Level.WARNING, "An error occurred while updating group for " + this.enchantConflict, e);
- MetricsUtil.INSTANCE.trackError(e);
}
// Save file configuration to disk
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/GroupConfigSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/GroupConfigSubSettingGui.java
index 3d05674..c49fec7 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/GroupConfigSubSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/GroupConfigSubSettingGui.java
@@ -5,7 +5,6 @@ import com.github.stefvanschie.inventoryframework.pane.PatternPane;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import io.delilaheve.CustomAnvil;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemFlag;
@@ -326,19 +325,19 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
// ----------------------------
@Override
- public Set getSelectedMaterials() {
+ public EnumSet getSelectedMaterials() {
return this.group.getNonGroupInheritedMaterials();
}
@Override
- public boolean setSelectedMaterials(Set materials) {
+ public boolean setSelectedMaterials(EnumSet materials) {
this.group.setNonGroupInheritedMaterials(materials);
// Write to file configuration
String[] groupNames = new String[materials.size()];
int index = 0;
- for (NamespacedKey otherGroup : materials) {
- groupNames[index++] = otherGroup.getKey().toLowerCase();
+ for (Material otherGroup : materials) {
+ groupNames[index++] = otherGroup.name().toLowerCase();
}
ConfigHolder.ITEM_GROUP_HOLDER.getConfig().set(this.group.getName()+"."+ItemGroupManager.MATERIAL_LIST_PATH, groupNames);
@@ -354,8 +353,8 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
}
@Override
- public Set illegalMaterials() {
- return Set.of(Material.AIR.getKey());
+ public EnumSet illegalMaterials() {
+ return EnumSet.of(Material.AIR);
}
// ----------------------------
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java
index 73121a6..af977e9 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java
@@ -72,8 +72,7 @@ public class IntSettingsGui extends AbstractSettingGui {
assert meta != null;
meta.setDisplayName("§eReset to default value");
- meta.setLore(Collections.singletonList("§7Default value is §e" +
- holder.valueDisplayName(ValueDisplayType.RESET, holder.defaultVal)));
+ meta.setLore(Collections.singletonList("§7Default value is §e" + holder.defaultVal));
item.setItemMeta(meta);
returnToDefault = new GuiItem(item, event -> {
event.setCancelled(true);
@@ -87,23 +86,41 @@ public class IntSettingsGui extends AbstractSettingGui {
* Update item using the setting value to match the new value.
*/
protected void updateValueDisplay() {
+
PatternPane pane = getPane();
// minus item
GuiItem minusItem;
if (now > holder.min) {
int planned = Math.max(holder.min, now - step);
- minusItem = valueEditItem(Material.RED_TERRACOTTA, ValueDisplayType.REMOVE, planned);
+ ItemStack item = new ItemStack(Material.RED_TERRACOTTA);
+ ItemMeta meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§e" + now + " §f-> §e" + planned + " §r(§c-" + (now - planned) + "§r)");
+ meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE));
+ item.setItemMeta(meta);
+
+ minusItem = new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance);
} else {
minusItem = GuiGlobalItems.backgroundItem(Material.BARRIER);
}
pane.bindItem('-', minusItem);
//plus item
+ // may do a function to generalise ?
GuiItem plusItem;
if (now < holder.max) {
int planned = Math.min(holder.max, now + step);
- plusItem = valueEditItem(Material.GREEN_TERRACOTTA, ValueDisplayType.ADD, planned);
+ ItemStack item = new ItemStack(Material.GREEN_TERRACOTTA);
+ ItemMeta meta = item.getItemMeta();
+ assert meta != null;
+
+ meta.setDisplayName("§e" + now + " §f-> §e" + planned + " §r(§a+" + (planned - now) + "§r)");
+ meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE));
+ item.setItemMeta(meta);
+
+ plusItem = new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance);
} else {
plusItem = GuiGlobalItems.backgroundItem(Material.BARRIER);
}
@@ -114,7 +131,7 @@ public class IntSettingsGui extends AbstractSettingGui {
ItemMeta resultMeta = resultPaper.getItemMeta();
assert resultMeta != null;
- resultMeta.setDisplayName("§fValue: §e" + holder.valueDisplayName(ValueDisplayType.CURRENT, now));
+ resultMeta.setDisplayName("§fValue: §e" + now);
resultMeta.setLore(holder.displayLore);
resultPaper.setItemMeta(resultMeta);
@@ -132,21 +149,7 @@ public class IntSettingsGui extends AbstractSettingGui {
}
pane.bindItem('D', returnToDefault);
- }
- private GuiItem valueEditItem(Material mat, ValueDisplayType type, int planned) {
- ItemStack item = new ItemStack(mat);
- ItemMeta meta = item.getItemMeta();
- assert meta != null;
-
- var nowDisplay = holder.valueDisplayName(type, now);
- var plannedDisplay = holder.valueDisplayName(type, planned);
- var deltaDisplay = holder.deltaDisplay(type, now, planned);
- meta.setDisplayName("§e" + nowDisplay + " §f-> §e" + plannedDisplay + " §r(§c" + deltaDisplay + "§r)");
-
- meta.setLore(Collections.singletonList(AbstractSettingGui.CLICK_LORE));
- item.setItemMeta(meta);
- return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance);
}
/**
@@ -386,23 +389,6 @@ public class IntSettingsGui extends AbstractSettingGui {
return getItem(itemMat, CasedStringUtil.detectToUpperSpacedCase(configPath));
}
- protected String valueDisplayName(ValueDisplayType type, int value) {
- return String.valueOf(value);
- }
-
- protected String deltaDisplay(ValueDisplayType type, int now, int planned) {
- var delta = planned - now;
- if(delta < 0) return "§c" + delta;
- else return "§a+" + delta;
- }
-
- }
-
- public enum ValueDisplayType {
- ADD,
- CURRENT,
- REMOVE,
- RESET,
}
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java
index fc519ff..a3963ce 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/MaterialSelectSettingGui.java
@@ -5,7 +5,6 @@ import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import io.delilaheve.CustomAnvil;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemFlag;
@@ -19,19 +18,18 @@ import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
-import xyz.alexcrea.cuanvil.util.MaterialUtil;
import java.util.*;
import java.util.function.Consumer;
-public class MaterialSelectSettingGui extends MappedElementListConfigGui {
+public class MaterialSelectSettingGui extends MappedElementListConfigGui {
private final SelectMaterialContainer selector;
private final Gui backGui;
private boolean instantRemove;
- private final List defaultMaterials;
- private final Set illegalMaterials;
+ private final List defaultMaterials;
+ private final EnumSet illegalMaterials;
private final int defaultMaterialHash;
private int nowMaterialHash;
@@ -163,7 +161,8 @@ public class MaterialSelectSettingGui extends MappedElementListConfigGui result = new HashSet<>(this.elementGuiMap.keySet());
+ EnumSet result = EnumSet.noneOf(Material.class);
+ result.addAll(this.elementGuiMap.keySet());
if(!this.selector.setSelectedMaterials(result)){
player.sendMessage("§cSomething went wrong while saving the change of value.");
@@ -186,8 +185,8 @@ public class MaterialSelectSettingGui extends MappedElementListConfigGui getEveryDisplayableInstanceOfGeneric() {
+ protected Collection getEveryDisplayableInstanceOfGeneric() {
return this.defaultMaterials;
}
@Override
- protected void updateElement(NamespacedKey material, GuiItem element) {
+ protected void updateElement(Material material, GuiItem element) {
// Nothing happen here I think
}
@Override
- protected GuiItem newElementRequested(NamespacedKey material, GuiItem newItem) {
+ protected GuiItem newElementRequested(Material material, GuiItem newItem) {
newItem.setAction(event -> {
if(this.instantRemove){
removeMaterial(material);
}else {
- String materialName = CasedStringUtil.snakeToUpperSpacedCase(material.getKey().toLowerCase());
+ String materialName = CasedStringUtil.snakeToUpperSpacedCase(material.name().toLowerCase());
// Create and show confirm remove gui.
ConfirmActionGui confirmGui = new ConfirmActionGui(
@@ -251,7 +250,7 @@ public class MaterialSelectSettingGui extends MappedElementListConfigGui materialList){
+ private static int hashFromMaterialList(List materialList){
int defaultMaterialHash = 0;
- for (NamespacedKey material : materialList) {
+ for (Material material : materialList) {
defaultMaterialHash ^= material.hashCode();
}
return defaultMaterialHash;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java
index 4345aa1..888aa25 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/WorkPenaltyTypeSettingGui.java
@@ -11,11 +11,11 @@ import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.config.WorkPenaltyType;
import xyz.alexcrea.cuanvil.gui.config.global.BasicConfigGui;
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
+import xyz.alexcrea.cuanvil.util.AnvilUseType;
import java.util.ArrayList;
import java.util.EnumMap;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/ModrinthUpdateChecker.java b/src/main/java/xyz/alexcrea/cuanvil/update/ModrinthUpdateChecker.java
deleted file mode 100644
index 489c636..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/ModrinthUpdateChecker.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2025 Clickism
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package xyz.alexcrea.cuanvil.update;
-
-import com.google.gson.*;
-import org.jetbrains.annotations.Nullable;
-
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-/**
- * Utility class to check for newer versions of a project hosted on Modrinth.
- */
-public class ModrinthUpdateChecker {
-
- private static final String API_URL = "https://api.modrinth.com/v2/project/{id}/version";
-
- private final String projectId;
- private final String loader;
- @Nullable
- private final String minecraftVersion;
-
- @Nullable
- private Boolean featured = null;
-
- @Nullable
- public Consumer onError = null;
- @Nullable
- public Function getRawVersion = ModrinthUpdateChecker::getRawVersion;
-
- /**
- * Create a new update checker for the given project.
- * This will check the latest version for the given loader and any minecraft version.
- *
- * @param projectId the project ID
- * @param loader the loader
- */
- public ModrinthUpdateChecker(String projectId, String loader) {
- this(projectId, loader, null);
- }
-
- /**
- * Create a new update checker for the given project.
- * This will check the latest version for the given loader and minecraft version.
- *
- * @param projectId the project ID
- * @param loader the loader
- * @param minecraftVersion the minecraft version, or null for any version
- */
- public ModrinthUpdateChecker(String projectId, String loader, @Nullable String minecraftVersion) {
- this.projectId = projectId;
- this.loader = loader;
- this.minecraftVersion = minecraftVersion;
- }
-
- /**
- * Check the latest version of the project for the given loader and minecraft version
- * and call the consumer with it.
- *
- * @param consumer the consumer
- */
- public void checkVersion(Consumer consumer) {
- try {
- HttpClient client = HttpClient.newHttpClient();
- HttpRequest request = HttpRequest.newBuilder()
- .uri(prepareURI())
- .GET()
- .build();
-
- client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
- .thenAcceptAsync(response -> {
- if (response.statusCode() != 200) {
- if(onError != null)
- onError.accept(new RuntimeException("wrong response status code: " + response.statusCode()));
- return;
- }
- JsonArray versionsArray = JsonParser.parseString(response.body()).getAsJsonArray();
- String latestVersion = getLatestVersion(versionsArray);
- if (latestVersion == null) {
- if(onError != null)
- onError.accept(new RuntimeException("latest version is null"));
- return;
- }
- consumer.accept(latestVersion);
- });
- } catch (Exception e) {
- if(onError != null) onError.accept(e);
- }
- }
-
- /**
- * Get the latest compatible version from the versions array.
- *
- * @param versions the versions array
- * @return the latest compatible version
- */
- @Nullable
- protected String getLatestVersion(JsonArray versions) {
- return versions.asList().stream().findFirst()
- .map(JsonElement::getAsJsonObject)
- .map(version -> version.get("version_number").getAsString())
- .map(getRawVersion != null ? getRawVersion : (v -> v))
- .orElse(null);
- }
-
- /**
- * Gets the raw version from a version string.
- * i.E: "fabric-1.2+1.17.1" -> "1.2"
- *
- * @param version the version string
- * @return the raw version string
- */
- public static String getRawVersion(String version) {
- if (version.isEmpty()) return version;
- version = version.replaceAll("^\\D+", "");
- String[] split = version.split("\\+");
- return split[0];
- }
-
- /**
- * Prepare this request uri based on current parameters.
- * @return the request uri
- */
- private URI prepareURI() {
- var url = new StringBuilder(API_URL.replace("{id}", projectId));
-
- var parameters = prepareParameters();
- String[] paramArray = new String[parameters.size()];
- int i = 0;
- for (Map.Entry entry : parameters.entrySet()) {
- paramArray[i++] = entry.getKey() + '=' + entry.getValue();
- }
- url.append('?').append(String.join("&", paramArray));
-
- return URI.create(url.toString());
- }
-
- /**
- * Get the parameters for the version request.
- *
- * @return a map of key-value map of the request parameters
- */
- private Map prepareParameters(){
- var parameters = new HashMap();
-
- parameters.put("loaders", List.of(loader).toString());
- if(minecraftVersion != null) parameters.put("game_versions", List.of(minecraftVersion).toString());
- if(featured != null) parameters.put("featured", featured.toString());
-
- parameters.put("include_changelog", "false");
- return parameters;
- }
-
- /**
- * Only get featured or non-featured versions.
- * Null represent no filter.
- * @param featured should be restricted to featured version ? default null if not called
- * @return this
- */
- public ModrinthUpdateChecker setFeatured(@Nullable Boolean featured) {
- this.featured = featured;
- return this;
- }
-
- /**
- * Function called on error calling the api.
- * @param onError What should happen on error
- * @return this
- */
- public ModrinthUpdateChecker setOnError(@Nullable Consumer onError) {
- this.onError = onError;
- return this;
- }
-
- /**
- * Set the function to get raw version from the modrinth version.
- * If null provided raw version will act as in the identity function.
- * @param getRawVersion The function transforming modrinth version to raw version
- * @return this
- */
- public ModrinthUpdateChecker setGetRawVersion(@Nullable Function getRawVersion) {
- this.getRawVersion = getRawVersion;
- return this;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/PluginSetDefault.java b/src/main/java/xyz/alexcrea/cuanvil/update/PluginSetDefault.java
index 707a218..f41842d 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/PluginSetDefault.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/PluginSetDefault.java
@@ -5,7 +5,6 @@ import io.delilaheve.util.ConfigOptions;
import org.bukkit.configuration.file.FileConfiguration;
import org.jetbrains.annotations.NotNull;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.util.MetricType;
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil;
import xyz.alexcrea.cuanvil.util.config.LoreEditType;
@@ -19,9 +18,6 @@ public class PluginSetDefault {
int nbSet = 0;
- nbSet += trySetDefault(config, METRIC_TYPE, MetricType.AUTO.getValue());
- nbSet += trySetDefault(config, METRIC_COLLECT_ERROR, true);
-
nbSet += trySetDefault(config, CAP_ANVIL_COST, DEFAULT_CAP_ANVIL_COST);
nbSet += trySetDefault(config, MAX_ANVIL_COST, DEFAULT_MAX_ANVIL_COST);
nbSet += trySetDefault(config, REMOVE_ANVIL_COST_LIMIT, DEFAULT_REMOVE_ANVIL_COST_LIMIT);
@@ -34,7 +30,7 @@ public class PluginSetDefault {
nbSet += trySetDefault(config, ALLOW_HEXADECIMAL_COLOR, DEFAULT_ALLOW_HEXADECIMAL_COLOR);
nbSet += trySetDefault(config, PERMISSION_NEEDED_FOR_COLOR, DEFAULT_PERMISSION_NEEDED_FOR_COLOR);
nbSet += trySetDefault(config, USE_OF_COLOR_COST, DEFAULT_USE_OF_COLOR_COST);
- nbSet += trySetDefault(config, PER_COLOR_CODE_PERMISSION, DEFAULT_PER_COLOR_CODE_PERMISSION);
+ nbSet += trySetDefault(config, DEFAULT_LIMIT_PATH, DEFAULT_ENCHANT_LIMIT);
// Lore Edit defaults
for (@NotNull LoreEditType value : LoreEditType.values()) {
@@ -61,11 +57,6 @@ public class PluginSetDefault {
nbSet += trySetDefault(config, PAPER_EDIT_ORDER, DEFAULT_PAPER_EDIT_ORDER);
- nbSet += trySetDefault(config, DIALOG_RENAME_ENABLED, DEFAULT_DIALOG_RENAME_ENABLED);
- nbSet += trySetDefault(config, DIALOG_MAX_SIZE, DEFAULT_DIALOG_MAX_SIZE);
- nbSet += trySetDefault(config, DIALOG_RENAME_USE_PERMISSION, DEFAULT_DIALOG_RENAME_USE_PERMISSION);
- nbSet += trySetDefault(config, DIALOG_KEEP_USER_TEXT, DEFAULT_DIALOG_KEEP_USER_TEXT);
-
if (nbSet > 0) {
CustomAnvil.instance.getLogger().info("Adding " + nbSet + " absent default config values.");
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java
index 660accb..82ee0f7 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java
@@ -77,12 +77,6 @@ public class UpdateHandler {
if (hadUpdate) {
CustomAnvil.instance.getLogger().info("Updating Done !");
}
-
- if(current.major() == 1 && current.minor() < 21) {
- var logger = CustomAnvil.instance.getLogger();
- logger.warning("Your are running an old version of minecraft (lower than 1.21)");
- logger.warning("Custom Anvil will stop supporting this version on the first of july 2026");
- }
}
private static void finishConfiguration(@Nonnull String newVersion, @Nonnull Set toSave) {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java
index 2907fef..c13515f 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateUtils.java
@@ -15,6 +15,22 @@ public class UpdateUtils {
return Version.fromString(versionString);
}
+ @Deprecated
+ public static int[] currentMinecraftVersionArray() {
+ String versionString = Bukkit.getServer().getBukkitVersion().split("-")[0];
+ return UpdateUtils.readVersionFromString(versionString);
+ }
+
+ public static int[] readVersionFromString(String versionString) {
+ String[] partialVersion = versionString.split("\\.");
+ int[] versionParts = new int[]{0, 0, 0};
+
+ for (int i = 0; i < Math.min(3, partialVersion.length); i++) {
+ versionParts[i] = Integer.parseInt(partialVersion[i]);
+ }
+ return versionParts;
+ }
+
public static void addToStringList(FileConfiguration config, String path, String... toAdd) {
List groups = new ArrayList<>(config.getStringList(path));
groups.addAll(Arrays.asList(toAdd));
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/Version.java b/src/main/java/xyz/alexcrea/cuanvil/update/Version.java
index a49fbdd..15476f5 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/Version.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/Version.java
@@ -21,11 +21,7 @@ public record Version(int major, int minor, int patch) {
int[] versionParts = new int[]{0, 0, 0};
for (int i = 0; i < Math.min(3, partialVersion.length); i++) {
- try {
- versionParts[i] = Integer.parseInt(partialVersion[i]);
- } catch (NumberFormatException e) {
- break;
- }
+ versionParts[i] = Integer.parseInt(partialVersion[i]);
}
return new Version(versionParts[0], versionParts[1], versionParts[2]);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_11_0.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_11_0.java
index 9740971..6d6baca 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_11_0.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_11_0.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.update.plugin;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.jetbrains.annotations.NotNull;
@@ -12,7 +11,6 @@ import xyz.alexcrea.cuanvil.group.AbstractMaterialGroup;
import xyz.alexcrea.cuanvil.group.IncludeGroup;
import javax.annotation.Nonnull;
-import java.util.Arrays;
import java.util.List;
import java.util.Set;
@@ -71,12 +69,7 @@ public class PUpdate_1_11_0 {
// Create new group
IncludeGroup group = new IncludeGroup(toolset);
- NamespacedKey[] keys = new NamespacedKey[toolMats.length];
- for (int i = 0; i < toolMats.length; i++) {
- keys[i] = toolMats[i].getKey();
- }
-
- group.addAll(keys);
+ group.addAll(toolMats);
MaterialGroupApi.addMaterialGroup(group, true);
@@ -84,8 +77,8 @@ public class PUpdate_1_11_0 {
if (tools == null) return;
if (!(tools instanceof IncludeGroup include)) return;
- List mats = List.of(keys);
- Set matSet = include.getNonGroupInheritedMaterials();
+ List mats = List.of(toolMats);
+ Set matSet = include.getNonGroupInheritedMaterials();
if (!matSet.containsAll(mats)) return;
mats.forEach(matSet::remove);
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_8_0.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_8_0.java
index 81ce1aa..7685f92 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_8_0.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_8_0.java
@@ -2,10 +2,10 @@ package xyz.alexcrea.cuanvil.update.plugin;
import io.delilaheve.util.ConfigOptions;
import org.bukkit.configuration.file.FileConfiguration;
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.config.WorkPenaltyType;
import xyz.alexcrea.cuanvil.gui.config.settings.WorkPenaltyTypeSettingGui;
+import xyz.alexcrea.cuanvil.util.AnvilUseType;
import javax.annotation.Nonnull;
import java.util.EnumMap;
diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt
index 4d99faf..c747189 100644
--- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt
+++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt
@@ -6,13 +6,10 @@ import org.bukkit.configuration.file.YamlConfiguration
import org.bukkit.plugin.java.JavaPlugin
import xyz.alexcrea.cuanvil.api.event.CAConfigReadyEvent
import xyz.alexcrea.cuanvil.api.event.CAEnchantRegistryReadyEvent
-import xyz.alexcrea.cuanvil.command.CustomAnvilCommand
import xyz.alexcrea.cuanvil.command.EditConfigExecutor
import xyz.alexcrea.cuanvil.command.ReloadExecutor
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil
-import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui
@@ -21,10 +18,9 @@ import xyz.alexcrea.cuanvil.listener.AnvilCloseListener
import xyz.alexcrea.cuanvil.listener.AnvilResultListener
import xyz.alexcrea.cuanvil.listener.ChatEventListener
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
-import xyz.alexcrea.cuanvil.update.ModrinthUpdateChecker
import xyz.alexcrea.cuanvil.update.PluginSetDefault
import xyz.alexcrea.cuanvil.update.UpdateHandler
-import xyz.alexcrea.cuanvil.util.MetricsUtil
+import xyz.alexcrea.cuanvil.util.Metrics
import java.io.File
import java.io.FileReader
import java.util.logging.Level
@@ -35,8 +31,8 @@ import java.util.logging.Level
open class CustomAnvil : JavaPlugin() {
companion object {
- // pluginIDS
- private const val modrinthPluginID = "S75Ueiq9"
+ // bstats plugin id
+ private const val bstatsPluginId = 20923
// Permission string required to use the plugin's features
const val affectedByPluginPermission = "ca.affected"
@@ -50,13 +46,9 @@ open class CustomAnvil : JavaPlugin() {
// Permission string required to reload the config
const val commandReloadPermission = "ca.command.reload"
- // Permission string required to get diagnostic data
- const val diagnosticPermission = "ca.command.diagnostic"
-
// Permission string required to edit the plugin's config
const val editConfigPermission = "ca.config.edit"
-
// Command Name to reload the config
const val commandReloadName = "anvilconfigreload"
@@ -69,8 +61,6 @@ open class CustomAnvil : JavaPlugin() {
// Chat message listener
lateinit var chatListener: ChatEventListener
- var latestVer: String? = null
-
/**
* Logging handler
*/
@@ -91,99 +81,12 @@ open class CustomAnvil : JavaPlugin() {
}
- // stop plugin if we do not force a dirty start (true by default)
- // Return true if start was stopped
- private fun tryDirtyStart(): Boolean {
- if(!ConfigHolder.DEFAULT_CONFIG.config.getBoolean("dirty_start", false)) {
- Bukkit.getPluginManager().disablePlugin(this)
- return true
- }
- return false
- }
-
- // stop plugin if we force a safe start (false by default)
- // Return true if start was stopped
- private fun trySafeStart(): Boolean {
- if(ConfigHolder.DEFAULT_CONFIG.config.getBoolean("safe_start", false)) {
- Bukkit.getPluginManager().disablePlugin(this)
- return true
- }
- return false
- }
-
/**
* Setup plugin for use
*/
override fun onEnable() {
instance = this
- try {
- legacyCheck()
- } catch (e: Exception) {
- logger.log(Level.SEVERE, "error trying to check for legacy system", e)
- MetricsUtil.trackError(e)
- if(trySafeStart()) return
- }
- // Add commands
- try {
- prepareCommand()
- } catch (e: Exception) {
- logger.log(Level.SEVERE, "error trying to register commands", e)
- MetricsUtil.trackError(e)
- if(trySafeStart()) return
- }
-
- // Load default configuration
- try {
- if(!ConfigHolder.loadDefaultConfig())
- throw RuntimeException("Error loading configuration file")
- } catch (e: Exception) {
- logger.log(Level.SEVERE, "error occurred loading default configuration", e)
- MetricsUtil.trackError(e)
- if(tryDirtyStart()) return
- }
-
- // Load dependency
- try {
- DependencyManager.loadDependency()
- } catch (e: Exception) {
- logger.log(Level.SEVERE, "error loading dependency compatibility", e)
- MetricsUtil.trackError(e)
- if(tryDirtyStart()) return
- }
-
- // Register listeners
- try {
- registerListeners()
- } catch (e: Exception) {
- logger.log(Level.SEVERE, "error registering listeners", e)
- MetricsUtil.trackError(e)
- if(tryDirtyStart()) return
- }
-
- // Load metrics
- MetricsUtil.loadMetrics(this)
-
- // Load other thing later.
- // It is so other dependent plugins can implement there event listener before we fire them.
- DependencyManager.scheduler.scheduleGlobally(this) { loadEnchantmentSystemDirty() }
- }
-
- override fun onDisable() {
- MetricsUtil.shutdownMetrics()
- }
-
- private fun loadEnchantmentSystemDirty() {
- try {
- loadEnchantmentSystem()
- } catch (e: Exception) {
- logger.log(Level.SEVERE, "error initializing enchantment system", e)
- MetricsUtil.trackError(e)
- tryDirtyStart()
- }
- }
-
- private fun legacyCheck() {
// Disable old plugin name if exist
val potentialPlugin = Bukkit.getPluginManager().getPlugin("UnsafeEnchantsPlus")
if (potentialPlugin != null) {
@@ -192,43 +95,38 @@ open class CustomAnvil : JavaPlugin() {
logger.warning("Please note CustomAnvil is a more recent version of UnsafeEnchantsPlus")
}
- val isPaper = PlatformUtil.isPaper
- if(!isPaper) {
+ if(!PlatformUtil.isPaper) {
logger.warning("It seems you are using spigot")
logger.warning("Please take notice that spigot is less supported than paper and derivatives")
- if(MinecraftVersionUtil.isTooNewForSpigot) {
- logger.warning("If replace too expensive is not working this is likely because of spigot")
- logger.warning("As native nms is not supported for spigot starting 26.1")
- }
}
- val loader = if(isPaper) "paper" else "spigot"
+ // Add commands
+ prepareCommand()
- val version = description.version
- val featured = if(version.contains("dev")) null else true
-
- ModrinthUpdateChecker(modrinthPluginID, loader, null)
- .setFeatured(featured)
- .setOnError {
- logger.log(Level.WARNING, "error trying to fetch latest update", it)
- }
- .checkVersion { latestVer: String? ->
- CustomAnvil.latestVer = latestVer
- if(latestVer == null || version.contains(latestVer)) return@checkVersion
-
- logger.warning("An update may be available: $latestVer")
- }
- }
-
- private fun registerListeners() {
- // Register chat listener
+ // Load chat listener
chatListener = ChatEventListener()
server.pluginManager.registerEvents(chatListener, this)
+ // Load default configuration
+ if (!ConfigHolder.loadDefaultConfig()) {
+ logger.log(Level.SEVERE,"could not load default config.")
+ return
+ }
+
+ // Load dependency
+ DependencyManager.loadDependency()
+
// Register anvil events
server.pluginManager.registerEvents(PrepareAnvilListener(), this)
server.pluginManager.registerEvents(AnvilResultListener(), this)
server.pluginManager.registerEvents(AnvilCloseListener(DependencyManager.packetManager), this)
+
+ // Load metrics
+ Metrics(this, bstatsPluginId)
+
+ // Load other thing later.
+ // It is so other dependent plugins can implement there event listener before we fire them.
+ DependencyManager.scheduler.scheduleGlobally(this, {loadEnchantmentSystem()})
}
private fun loadEnchantmentSystem(){
@@ -241,8 +139,7 @@ open class CustomAnvil : JavaPlugin() {
// Load config
if (!ConfigHolder.loadNonDefaultConfig()) {
- logger.log(Level.SEVERE,"Plugin has an issue while trying to load non default config... exiting...")
- server.pluginManager.disablePlugin(this)
+ logger.log(Level.SEVERE,"could not load non default config.")
return
}
@@ -260,11 +157,9 @@ open class CustomAnvil : JavaPlugin() {
MainConfigGui.getInstance().init(DependencyManager.packetManager)
GuiSharedConstant.loadConstants()
- // Prepare economy if possible
- EconomyManager.setupEconomy(this)
-
// Finally, re add default we may be missing
PluginSetDefault.reAddMissingDefault()
+
}
fun reloadResource(
@@ -316,8 +211,6 @@ open class CustomAnvil : JavaPlugin() {
command = getCommand(commandConfigName)
command?.setExecutor(EditConfigExecutor())
-
- CustomAnvilCommand(this)
}
}
diff --git a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt
index 9dc85f9..afb009f 100644
--- a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt
+++ b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt
@@ -2,17 +2,14 @@ package io.delilaheve.util
import io.delilaheve.CustomAnvil
import io.delilaheve.util.EnchantmentUtil.enchantmentName
+import org.bukkit.Material
import org.bukkit.NamespacedKey
-import org.bukkit.entity.HumanEntity
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.config.WorkPenaltyType
import xyz.alexcrea.cuanvil.config.WorkPenaltyType.WorkPenaltyPart
import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
-import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
-import java.math.BigDecimal
+import xyz.alexcrea.cuanvil.util.AnvilUseType
import java.util.*
/**
@@ -24,9 +21,6 @@ object ConfigOptions {
// Path for config values
// ----------------------
- const val METRIC_TYPE = "metric_type"
- const val METRIC_COLLECT_ERROR = "metric_collect_errors"
-
const val CAP_ANVIL_COST = "limit_repair_cost"
const val MAX_ANVIL_COST = "limit_repair_value"
const val REMOVE_ANVIL_COST_LIMIT = "remove_repair_limit"
@@ -48,8 +42,6 @@ object ConfigOptions {
const val PERMISSION_NEEDED_FOR_COLOR = "permission_needed_for_color"
const val USE_OF_COLOR_COST = "use_of_color_cost"
- const val PER_COLOR_CODE_PERMISSION = "per_color_code_permission"
-
// Work penalty config
const val WORK_PENALTY_ROOT = "work_penalty"
const val WORK_PENALTY_INCREASE = "shared_increase"
@@ -62,25 +54,15 @@ object ConfigOptions {
const val ENCHANT_COUNT_LIMIT_DEFAULT = "$ENCHANT_COUNT_LIMIT_ROOT.default"
const val ENCHANT_COUNT_LIMIT_ITEMS = "$ENCHANT_COUNT_LIMIT_ROOT.items"
+ const val DEFAULT_LIMIT_PATH = "default_limit"
+
const val ENCHANT_LIMIT_ROOT = "enchant_limits"
const val ENCHANT_VALUES_ROOT = "enchant_values"
- // Dialog menu rename
- const val DIALOG_RENAME_ENABLED = "enable_dialog_rename"
- const val DIALOG_MAX_SIZE = "dialog_rename_max_size"
- const val DIALOG_RENAME_USE_PERMISSION = "permission_needed_for_dialog_rename"
- const val DIALOG_KEEP_USER_TEXT = "dialog_rename_keep_user_text"
-
- // Others
const val DISABLE_MERGE_OVER_ROOT = "disable-merge-over"
const val IMMUTABLE_ENCHANTMENT_LIST = "immutable_enchantments"
- // Monetary configs
- const val MONETARY_USAGE_ROOT = "monetary_cost"
- const val SHOULD_USE_MONEY = "$MONETARY_USAGE_ROOT.enabled"
- const val MONEY_CURRENCY = "$MONETARY_USAGE_ROOT.currency"
- const val MONETARY_MULTIPLIER_ROOT = "$MONETARY_USAGE_ROOT.multipliers"
// Keys for specific enchantment values
private const val KEY_BOOK = "book"
@@ -117,23 +99,12 @@ object ConfigOptions {
const val DEFAULT_PERMISSION_NEEDED_FOR_COLOR = true
const val DEFAULT_USE_OF_COLOR_COST = 0
- const val DEFAULT_PER_COLOR_CODE_PERMISSION = false
-
- // Monetary configs
- const val DEFAULT_SHOULD_USE_MONEY = false
- const val DEFAULT_MONEY_CURRENCY = "default"
- const val DEFAULT_MONEY_MULTIPLIER = 1.0
+ const val DEFAULT_ENCHANT_LIMIT = 5
// Debug flag
private const val DEFAULT_DEBUG_LOG = false
private const val DEFAULT_VERBOSE_DEBUG_LOG = false
- // Dialog menu rename
- const val DEFAULT_DIALOG_RENAME_ENABLED = false
- const val DEFAULT_DIALOG_MAX_SIZE = 256
- const val DEFAULT_DIALOG_RENAME_USE_PERMISSION = false
- const val DEFAULT_DIALOG_KEEP_USER_TEXT = true
-
// -------------
// Config Ranges
// -------------
@@ -158,11 +129,9 @@ object ConfigOptions {
@JvmField
val USE_OF_COLOR_COST_RANGE = 0..1000
- @JvmField
- val DIALOG_MAX_SIZE_RANGE = 0..Int.MAX_VALUE
-
// Valid range for an enchantment limit
- const val ENCHANT_LIMIT = 255
+ @JvmField
+ val ENCHANT_LIMIT_RANGE = 1..255
// Valid range for an enchantment count limit
@JvmField
@@ -178,11 +147,6 @@ object ConfigOptions {
// Default max before merge disabled (negative mean enabled)
const val DEFAULT_MAX_BEFORE_MERGE_DISABLED = -1
- // -----------
- // Permissions
- // -----------
- private const val RENAME_DIALOG_PERMISSION = "ca.rename.dialog"
-
// -------------
// Get methods
// -------------
@@ -335,16 +299,6 @@ object ConfigOptions {
.getBoolean(PERMISSION_NEEDED_FOR_COLOR, DEFAULT_PERMISSION_NEEDED_FOR_COLOR)
}
- /**
- * Should each color code require a permission
- */
- val usePerColorCodePermission: Boolean
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(PER_COLOR_CODE_PERMISSION, DEFAULT_PER_COLOR_CODE_PERMISSION)
- }
-
/**
* How many xp should use of color should cost
*/
@@ -391,12 +345,22 @@ object ConfigOptions {
return WorkPenaltyPart(penaltyIncrease, penaltyAdditive, exclusivePenaltyIncrease, exclusivePenaltyAdditive)
}
+ /**
+ * Default enchantment limit
+ */
+ private val defaultEnchantLimit: Int
+ get() {
+ return ConfigHolder.DEFAULT_CONFIG
+ .config
+ .getInt(DEFAULT_LIMIT_PATH, DEFAULT_ENCHANT_LIMIT)
+ }
+
/**
* Get material enchantment count limit
*
* @return the current enchantment limit. -1 if none
*/
- fun getEnchantCountLimit(type: NamespacedKey): Int? {
+ fun getEnchantCountLimit(type: Material): Int? {
val limit = materialEnchantCountLimit(type)
if(limit != null) return limit
@@ -410,8 +374,8 @@ object ConfigOptions {
*
* @return The current enchantment limit. -1 if none
*/
- private fun materialEnchantCountLimit(type: NamespacedKey): Int? {
- val path = "$ENCHANT_COUNT_LIMIT_ITEMS.${type.key.lowercase()}"
+ private fun materialEnchantCountLimit(type: Material): Int? {
+ val path = "$ENCHANT_COUNT_LIMIT_ITEMS.${type.key.key.lowercase()}"
if(!ConfigHolder.DEFAULT_CONFIG.config.isInt(path))
return null
@@ -451,90 +415,46 @@ object ConfigOptions {
.getBoolean(VERBOSE_DEBUG_LOGGING, DEFAULT_VERBOSE_DEBUG_LOG)
}
- /**
- * Is the dialog menu for rename enabled
- */
- val doRenameDialog: Boolean
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(DIALOG_RENAME_ENABLED, DEFAULT_DIALOG_RENAME_ENABLED)
- }
-
- /**
- * Do the dialog menu require permission
- */
- val doRenameDialogUsePermission: Boolean
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(DIALOG_RENAME_USE_PERMISSION, DEFAULT_DIALOG_RENAME_USE_PERMISSION)
- }
-
- fun canUseDialogRename(player: HumanEntity): Boolean {
- if(!doRenameDialog || !AnvilRenameDialogUtil.anvilRenameDialog.canSendDialog()) return false
- if(doRenameDialogUsePermission && !player.hasPermission(RENAME_DIALOG_PERMISSION)) return false
-
- return true
- }
-
- /**
- * Do the dialog menu require permission
- */
- val renameDialogMaxSize: Int
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getInt(DIALOG_MAX_SIZE, DEFAULT_DIALOG_MAX_SIZE)
- .takeIf { it in DIALOG_MAX_SIZE_RANGE }
- ?: Int.MAX_VALUE
- }
-
- /**
- * Should the text used for rename should be kept in the item's pdc
- */
- val shouldKeepRenameText: Boolean
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(DIALOG_KEEP_USER_TEXT, DEFAULT_DIALOG_KEEP_USER_TEXT)
- }
-
/**
* Get the given [enchantment]'s limit
*/
fun enchantLimit(enchantment: CAEnchantment): Int {
- val limit = rawEnchantLimit(enchantment)
- if(limit >= 0) return limit.coerceAtMost(ENCHANT_LIMIT)
-
- // get default
- return enchantment.defaultMaxLevel()
- }
-
- /**
- * Get the given [enchantment]'s limit
- */
- fun rawEnchantLimit(enchantment: CAEnchantment): Int {
// Test namespace
var limit = enchantLimit(enchantment.key.toString())
- if (limit >= 0) return limit
+ if (limit != null) return limit
// Test legacy (name only)
limit = enchantLimit(enchantment.enchantmentName)
- if (limit >= 0) return limit
+ if (limit != null) return limit
- // Default to negative
- return -1
+ // get default (and test old legacy if present)
+ return getDefaultLevel(enchantment.enchantmentName)
}
/**
* Get the given [enchantmentName]'s limit
*/
- private fun enchantLimit(enchantmentName: String): Int {
+ private fun enchantLimit(enchantmentName: String): Int? {
val path = "${ENCHANT_LIMIT_ROOT}.$enchantmentName"
- return CustomAnvil.instance.config
- .getInt(path, -1)
+ return CustomAnvil.instance
+ .config
+ .getInt(path, ENCHANT_LIMIT_RANGE.first - 1)
+ .takeIf { it in ENCHANT_LIMIT_RANGE }
+ }
+
+ /**
+ * Get default value if enchantment do not exist on config
+ */
+ private fun getDefaultLevel(
+ enchantmentName: String, // compatibility with 1.20.5. TODO better update system
+ ): Int {
+ if (enchantmentName == "sweeping_edge") {
+ val limit = enchantLimit("sweeping")
+ if (limit != null) return limit
+
+ }
+ return defaultEnchantLimit
}
/**
@@ -606,20 +526,20 @@ object ConfigOptions {
fun maxBeforeMergeDisabled(enchantment: CAEnchantment): Int {
val key = enchantment.key.toString()
var value = maxBeforeMergeDisabled(key)
- if (value >= 0) return value
+ if (value != null) return value
// Legacy name
val legacy = enchantment.enchantmentName
value = maxBeforeMergeDisabled(legacy)
- if (value >= 0) return value
+ if (value != null) return value
if (key == "minecraft:sweeping_edge") {
value = maxBeforeMergeDisabled("minecraft:sweeping")
- if (value >= 0) return value
+ if (value != null) return value
// legacy name of legacy enchantment name
value = maxBeforeMergeDisabled("sweeping")
- if (value >= 0) return value
+ if (value != null) return value
}
return DEFAULT_MAX_BEFORE_MERGE_DISABLED
@@ -629,13 +549,14 @@ object ConfigOptions {
* Get the given [enchantmentName]'s level before merge is disabled
* a negative value would mean never disabled
*/
- private fun maxBeforeMergeDisabled(enchantmentName: String): Int {
+ private fun maxBeforeMergeDisabled(enchantmentName: String): Int? {
// find if set
val path = "${DISABLE_MERGE_OVER_ROOT}.$enchantmentName"
return CustomAnvil.instance
.config
- .getInt(path, -1)
+ .getInt(path, ENCHANT_LIMIT_RANGE.min() - 1)
+ .takeIf { it in ENCHANT_LIMIT_RANGE }
}
fun isImmutable(key: NamespacedKey): Boolean {
@@ -651,29 +572,4 @@ object ConfigOptions {
return false
}
- /*
- * Monetary configs (only for 1.21.6+)
- * Also require dialog rename
- */
- fun shouldUseMoney(player: HumanEntity): Boolean {
- return EconomyManager.economy?.initialized() == true &&
- canUseDialogRename(player) &&
- ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(SHOULD_USE_MONEY, DEFAULT_SHOULD_USE_MONEY)
- }
-
- val usedCurrency: String
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getString(MONEY_CURRENCY, DEFAULT_MONEY_CURRENCY)!!
- }
-
- fun getMonetaryMultiplier(type: String): BigDecimal {
- return BigDecimal(ConfigHolder.DEFAULT_CONFIG
- .config
- .getDouble("$MONETARY_MULTIPLIER_ROOT.$type", DEFAULT_MONEY_MULTIPLIER))
- }
-
}
diff --git a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt
index af959f2..bee9bda 100644
--- a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt
+++ b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt
@@ -4,9 +4,9 @@ import io.delilaheve.CustomAnvil
import org.bukkit.entity.HumanEntity
import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.config.ConfigHolder
+import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
import xyz.alexcrea.cuanvil.group.ConflictType
-import xyz.alexcrea.cuanvil.util.MaterialUtil.customType
import kotlin.math.max
import kotlin.math.min
@@ -31,97 +31,87 @@ object EnchantmentUtil {
) = mutableMapOf().apply {
putAll(this@combineWith)
- CustomAnvil.verboseLog("Testing merge")
val bypassFuse = player.hasPermission(CustomAnvil.bypassFusePermission)
val bypassLevel = player.hasPermission(CustomAnvil.bypassLevelPermission)
- var maxEnchantCount = ConfigOptions.getEnchantCountLimit(item.customType)
+ var maxEnchantCount = ConfigOptions.getEnchantCountLimit(item.type)
if(maxEnchantCount == null || maxEnchantCount < 0) maxEnchantCount = Int.MAX_VALUE
- val allowed = other.filter { (enchantment, _) -> enchantment.isAllowed(player) }
- val new = allowed.filter{ (enchantment, _) -> !containsKey(enchantment)}
- val old = allowed.filter{ (enchantment, _) -> containsKey(enchantment)}
+ other.forEach { (enchantment, level) ->
+ if(!enchantment.isAllowed(player)) return@forEach
- fun maxLevel(enchantment: CAEnchantment): Int {
- val max = if (bypassLevel) { 255 }
- else { ConfigOptions.enchantLimit(enchantment) }
-
- CustomAnvil.verboseLog("Max level of ${enchantment.key} is $max (bypassLevel is $bypassLevel)")
- return max
- }
-
- old.forEach { (enchantment, level) ->
// Get max level or 255 if player can bypass
- val maxLevel = maxLevel(enchantment)
+ val maxLevel = if (bypassLevel) { 255 }
+ else { ConfigOptions.enchantLimit(enchantment) }
+ CustomAnvil.verboseLog("Max level of ${enchantment.key} is $maxLevel (bypassLevel is $bypassLevel)")
+
val cappedLevel = min(level, maxLevel)
- val oldLevel = this[enchantment]!! // <- should not be null. (enchantment already in result list)
+ // Enchantment not yet in result list
+ if (!containsKey(enchantment)) {
+ // Do not allow new enchantment if above maximum
+ if(this.size >= maxEnchantCount) return@forEach
+
+ // Add the enchantment if it doesn't have conflicts, or if player is allowed to bypass enchantment restrictions
+ this[enchantment] = cappedLevel
+ if(bypassFuse){
+ CustomAnvil.verboseLog("Bypassed conflict check for ${enchantment.key}")
+ return@forEach
+ }
+
+ val conflictType = ConfigHolder.CONFLICT_HOLDER.conflictManager
+ .isConflicting(this, item, enchantment)
+
+ if (conflictType != ConflictType.NO_CONFLICT) {
+ CustomAnvil.verboseLog("Enchantment not yet in result list, but there is conflict (${enchantment.key}, conflict: $conflictType)")
+ this.remove(enchantment)
+ }
- // ... and they're not the same level
- if (oldLevel != cappedLevel) {
- // apply the greater of the two or left one if right is above max
- this[enchantment] = max(oldLevel, cappedLevel)
}
- // ... and they're the same level
+ // Enchantment already in result list
else {
- // We test if it is allowed to merge at this level
- if(!bypassLevel){
- val maxBeforeDisabled = ConfigOptions.maxBeforeMergeDisabled(enchantment)
- if((maxBeforeDisabled > 0) && (oldLevel >= maxBeforeDisabled)) {
+ val oldLevel = this[enchantment]!! // <- should not be null. (enchantment already in result list)
+
+ if(bypassFuse){
+ CustomAnvil.verboseLog("Bypassed conflict check for ${enchantment.key}")
+ } else {
+ val conflictType = ConfigHolder.CONFLICT_HOLDER.conflictManager
+ .isConflicting(this, item, enchantment)
+
+ // ... and they are conflicting
+ if(conflictType != ConflictType.NO_CONFLICT){
CustomAnvil.verboseLog(
- "Reached max merge before disable for ${enchantment.key}: $oldLevel/$maxBeforeDisabled)")
+ "Enchantment already in result list, and they are conflicting (${enchantment.key}, conflict: $conflictType)")
return@forEach
}
}
- // Now we increase the enchantment level by 1
- var newLevel = oldLevel + 1
- newLevel = max(min(newLevel, maxLevel), oldLevel)
- this[enchantment] = newLevel
- }
+ // ... and they're not the same level
+ if (oldLevel != cappedLevel) {
+ // apply the greater of the two or left one if right is above max
+ this[enchantment] = max(oldLevel, cappedLevel)
- if(bypassFuse){
- CustomAnvil.verboseLog("Bypassed conflict check for ${enchantment.key}")
- } else {
- val conflictType = ConfigHolder.CONFLICT_HOLDER.conflictManager
- .isConflicting(this, item, enchantment)
+ }
+ // ... and they're the same level
+ else {
+ // We test if it is allowed to merge at this level
+ if(!bypassLevel){
+ val maxBeforeDisabled = ConfigOptions.maxBeforeMergeDisabled(enchantment)
+ if((maxBeforeDisabled > 0) && (oldLevel >= maxBeforeDisabled)) {
+ CustomAnvil.verboseLog(
+ "Reached max merge before disable for ${enchantment.key}: $oldLevel/$maxBeforeDisabled)")
+ return@forEach
+ }
+ }
+
+ // Now we increase the enchantment level by 1
+ var newLevel = oldLevel + 1
+ newLevel = max(min(newLevel, maxLevel), oldLevel)
+ this[enchantment] = newLevel
- // ... and they are conflicting
- if(conflictType != ConflictType.NO_CONFLICT){
- CustomAnvil.verboseLog(
- "Enchantment already in result list, and they are conflicting (${enchantment.key}, conflict: $conflictType)")
- this[enchantment] = oldLevel
- return@forEach
}
}
}
-
- // Try to add new now
- new.forEach { (enchantment, level) ->
- // Get max level or 255 if player can bypass
- val maxLevel = maxLevel(enchantment)
- val cappedLevel = min(level, maxLevel)
-
- // Do not allow new enchantment if above maximum
- if(this.size >= maxEnchantCount) return@forEach
-
- // Add the enchantment if it doesn't have conflicts, or if player is allowed to bypass enchantment restrictions
- this[enchantment] = cappedLevel
- if(bypassFuse){
- CustomAnvil.verboseLog("Bypassed conflict check for ${enchantment.key}")
- return@forEach
- }
-
- val conflictType = ConfigHolder.CONFLICT_HOLDER.conflictManager
- .isConflicting(this, item, enchantment)
-
- if (conflictType != ConflictType.NO_CONFLICT) {
- CustomAnvil.verboseLog("Enchantment not yet in result list, but there is conflict (${enchantment.key}, conflict: $conflictType)")
- this.remove(enchantment)
- }
-
- }
-
}
}
diff --git a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt
index 25698ad..a85af39 100644
--- a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt
+++ b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt
@@ -4,9 +4,6 @@ import org.bukkit.Material.ENCHANTED_BOOK
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.Damageable
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
-import xyz.alexcrea.cuanvil.update.UpdateUtils
-import xyz.alexcrea.cuanvil.util.MaterialUtil.customType
-import xyz.alexcrea.cuanvil.util.MaxDamageCheckerUtil
import kotlin.math.ceil
import kotlin.math.max
import kotlin.math.min
@@ -38,13 +35,6 @@ object ItemUtil {
}
- private fun maxDamage(damageable: Damageable): Int {
- val ver = UpdateUtils.currentMinecraftVersion()
- if(ver.major <= 1 && ver.minor <= 20 && ver.patch < 5) return Integer.MAX_VALUE
-
- return MaxDamageCheckerUtil.getMaxDamage(damageable)
- }
-
/**
* Set this [ItemStack]s durability from a combination of the
* [first] and [second] item's durability values
@@ -64,9 +54,7 @@ object ItemUtil {
val secondDurability = durability - secondDamage
val combinedDurability = firstDurability + secondDurability
val newDurability = min(combinedDurability, durability)
-
- val maxDamage = maxDamage(it)
- it.damage = min(durability - newDurability, maxDamage)
+ it.damage = durability - newDurability
itemMeta = it
return true
}
@@ -102,5 +90,5 @@ object ItemUtil {
*/
fun ItemStack.canMergeWith(
other: ItemStack?
- ) = (other != null) && (customType == other.customType || (other.isEnchantedBook()))
+ ) = (other != null) && (type == other.type || (other.isEnchantedBook()))
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt
deleted file mode 100644
index 710687c..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-package xyz.alexcrea.cuanvil.anvil
-
-import io.delilaheve.util.ConfigOptions
-import java.math.BigDecimal
-import kotlin.math.min
-import io.delilaheve.util.ConfigOptions.getMonetaryMultiplier as moneyMultiplier
-
-open class AnvilCost {
- private val isAlone: Boolean
- var valid = true // Get set as invalid if cost can be satisfied
- var isMonetary = false
-
- var generic = 0
- var enchantment = 0
- var repair = 0
- var rename = 0
- var lore = 0
- var illegalPenalty = 0
- var workPenalty = 0
- var recipe = 0
-
- constructor(generic: Int) {
- this.generic = generic
- isAlone = true
- }
-
- constructor() {
- isAlone = false
- }
-
- fun asXpCost(): Int {
- return generic + enchantment + repair + rename + lore + illegalPenalty + workPenalty + recipe
- }
-
- fun filteredXpCost(ignoreRules: Boolean = false): Int {
- val original = asXpCost()
-
- // Test repair cost limit
- return if (
- !ignoreRules &&
- !ConfigOptions.doRemoveCostLimit &&
- ConfigOptions.doCapCost
- ) {
- min(original, ConfigOptions.maxAnvilCost)
- } else {
- original
- }
- }
-
- open fun asMonetaryCost(): BigDecimal {
- // multiply by per use type multipliers
- return BigDecimal(generic)
- .add(BigDecimal(enchantment).multiply(moneyMultiplier("enchantment")))
- .add(BigDecimal(repair).multiply(moneyMultiplier("repair")))
- .add(BigDecimal(rename).multiply(moneyMultiplier("rename")))
- .add(BigDecimal(lore).multiply(moneyMultiplier("lore_edit")))
- .add(BigDecimal(enchantment).multiply(moneyMultiplier("enchantment")))
- .add(BigDecimal(illegalPenalty).multiply(moneyMultiplier("work_penalty")))
- .add(BigDecimal(workPenalty).multiply(moneyMultiplier("work_penalty")))
- .add(BigDecimal(recipe).multiply(moneyMultiplier("recipe")))
- .multiply(moneyMultiplier("global"))
- }
-}
-
-class CustomCraftCost(val rawCost: Int): AnvilCost() {
-
- override fun asMonetaryCost(): BigDecimal {
- return BigDecimal(rawCost)
- .multiply(moneyMultiplier("global"))
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt
deleted file mode 100644
index 6b106fc..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt
+++ /dev/null
@@ -1,331 +0,0 @@
-package xyz.alexcrea.cuanvil.anvil
-
-import io.delilaheve.CustomAnvil
-import io.delilaheve.util.ConfigOptions
-import io.delilaheve.util.EnchantmentUtil.combineWith
-import io.delilaheve.util.ItemUtil.findEnchantments
-import io.delilaheve.util.ItemUtil.isEnchantedBook
-import io.delilaheve.util.ItemUtil.repairFrom
-import io.delilaheve.util.ItemUtil.setEnchantmentsUnsafe
-import io.delilaheve.util.ItemUtil.unitRepair
-import org.bukkit.ChatColor
-import org.bukkit.Material
-import org.bukkit.entity.HumanEntity
-import org.bukkit.entity.Player
-import org.bukkit.inventory.AnvilInventory
-import org.bukkit.inventory.InventoryView
-import org.bukkit.inventory.ItemStack
-import org.bukkit.inventory.meta.ItemMeta
-import org.bukkit.persistence.PersistentDataType
-import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dialog.AnvilRenameDialog
-import xyz.alexcrea.cuanvil.enchant.CAEnchantment
-import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe
-import xyz.alexcrea.cuanvil.util.CasedStringUtil
-import xyz.alexcrea.cuanvil.util.CustomRecipeUtil
-import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir
-import xyz.alexcrea.cuanvil.util.MiniMessageUtil
-import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair
-import xyz.alexcrea.cuanvil.util.anvil.AnvilColorUtil
-import xyz.alexcrea.cuanvil.util.anvil.AnvilLoreEditUtil
-import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
-import xyz.alexcrea.cuanvil.util.config.LoreEditType
-import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
-
-object AnvilMergeLogic {
-
- open class AnvilResult {
- companion object {
- val EMPTY = AnvilResult(null, AnvilCost())
- }
-
- val item: ItemStack?
- val cost: AnvilCost
- val ignoreXpRules: Boolean
-
- constructor(item: ItemStack?, cost: AnvilCost, ignoreXpRules: Boolean = false) {
- this.item = item
- this.cost = cost
- this.ignoreXpRules = ignoreXpRules
- }
-
- fun isEmpty(): Boolean {
- return item == null
- }
- }
-
- class UnitRepairResult : AnvilResult {
- companion object {
- val EMPTY = UnitRepairResult(null, AnvilCost(), 0)
- }
-
- val repairAmount: Int
-
- constructor(item: ItemStack?, cost: AnvilCost, repairAmount: Int) : super(item, cost) {
- this.repairAmount = repairAmount
- }
- }
-
- class CustomCraftResult : AnvilResult {
- companion object {
- val EMPTY = CustomCraftResult(null, CustomCraftCost(0), 0, null)
- }
-
- val customCraftCost: CustomCraftCost
- val amount: Int
- val recipe: AnvilCustomRecipe?
-
- constructor(
- item: ItemStack?, cost: CustomCraftCost,
- amount: Int, recipe: AnvilCustomRecipe?
- ) : super(item, cost, true) {
- this.customCraftCost = cost
- this.amount = amount
- this.recipe = recipe
- }
- }
-
- class LoreEditResult : AnvilResult {
- companion object {
- val EMPTY = LoreEditResult(null, AnvilCost(), LoreEditType.APPEND_PAPER)
- }
-
- val type: LoreEditType
-
- constructor(item: ItemStack?, cost: AnvilCost, type: LoreEditType) : super(item, cost) {
- this.type = type
- }
- }
-
- fun doRenaming(
- view: InventoryView, //TODO use anvil view
- inventory: AnvilInventory,
- player: Player, first: ItemStack
- ): AnvilResult {
- val resultItem = DependencyManager.cloneItem(player, first)
- val cost = AnvilCost()
- cost.rename = handleRename(resultItem, inventory, player)
-
- // Test/stop if nothing changed.
- if (first == resultItem) {
- CustomAnvil.log("no right item, But input is same as output")
- return AnvilResult.EMPTY
- }
-
- cost.workPenalty = AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.RENAME_ONLY)
- val result =
- DependencyManager.tryTreatAnvilResult(view, inventory, player, resultItem, AnvilUseType.RENAME_ONLY, cost)
-
- return AnvilResult(result, cost)
- }
-
- private fun processDialogPCD(meta: ItemMeta, player: HumanEntity) {
- val text = AnvilRenameDialogUtil.anvilRenameDialog.currentText(player)
- return processPCD(meta, player, text)
- }
-
- fun processPCD(meta: ItemMeta, player: HumanEntity, text: String?) {
- val keepDialog = ConfigOptions.canUseDialogRename(player) && ConfigOptions.shouldKeepRenameText
-
- val pdc = meta.persistentDataContainer
- if (!keepDialog)
- pdc.remove(AnvilRenameDialog.PCD_KEEP_RENAME_TEXT_KEY)
- else {
- if (text == null || text.isBlank())
- pdc.remove(AnvilRenameDialog.PCD_KEEP_RENAME_TEXT_KEY)
- else pdc.set(AnvilRenameDialog.PCD_KEEP_RENAME_TEXT_KEY, PersistentDataType.STRING, text)
- }
- }
-
- private fun handleRename(resultItem: ItemStack, inventory: AnvilInventory, player: HumanEntity): Int {
- // Can be null
- var renameText = ChatColor.stripColor(inventory.renameText)
-
- var sumCost = 0
- var useColor = false
- if (ConfigOptions.renameColorPossible && renameText != null) {
- val component = AnvilColorUtil.handleColor(
- renameText,
- AnvilColorUtil.renamePermission(player)
- )
-
- if (component != null) {
- renameText = MiniMessageUtil.legacy_mm.serialize(component)
-
- sumCost += ConfigOptions.useOfColorCost
- useColor = true
- }
- }
-
- // Rename item and add renaming cost
- resultItem.itemMeta?.let {
- val hasDisplayName = it.hasDisplayName()
- val displayName = if (!hasDisplayName) null
- else if (useColor) it.displayName
- else ChatColor.stripColor(it.displayName)
-
-
- if (!displayName.contentEquals(renameText) && !(displayName == null &&
- renameText == "" ||
- //TODO on recent paper check effective name instead
- renameText == CasedStringUtil.snakeToUpperSpacedCase(resultItem.type.name.lowercase())
- )
- ) {
- it.setDisplayName(renameText)
- processDialogPCD(it, player)
- resultItem.itemMeta = it
-
- sumCost += ConfigOptions.itemRenameCost
- }
-
- return sumCost
- }
- return 0
- }
-
- fun doMerge(
- view: InventoryView, //TODO use anvil view instead
- inventory: AnvilInventory,
- player: Player,
- first: ItemStack, second: ItemStack
- ): AnvilResult {
- val newEnchants = first.findEnchantments()
- .combineWith(second.findEnchantments(), first, player)
- var hasChanged = !isIdentical(first.findEnchantments(), newEnchants)
-
- val resultItem = DependencyManager.cloneItem(player, first)
- val cost = AnvilCost()
- if (hasChanged) {
- resultItem.setEnchantmentsUnsafe(newEnchants)
- // Calculate enchantment cost
- AnvilXpUtil.getRightValues(second, resultItem, cost)
- }
-
- // Calculate repair cost
- if (!first.isEnchantedBook() && !second.isEnchantedBook()) {
- // we only need to be concerned with repair when neither item is a book
- val repaired = resultItem.repairFrom(first, second)
- cost.repair = if (repaired) ConfigOptions.itemRepairCost else 0
- hasChanged = hasChanged || repaired
- }
-
- // Test/stop if nothing changed.
- if (!hasChanged) {
- CustomAnvil.log("Mergeable with second, But input is same as output")
- return AnvilResult.EMPTY
- }
- // As calculatePenalty edit result, we need to calculate penalty after checking equality
- cost.workPenalty = AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE)
- // Calculate rename cost
- cost.rename = handleRename(resultItem, inventory, player)
-
- val result =
- DependencyManager.tryTreatAnvilResult(view, inventory, player, resultItem, AnvilUseType.MERGE, cost)
-
- return AnvilResult(result, cost)
- }
-
- private fun isIdentical(
- firstEnchants: MutableMap,
- resultEnchants: MutableMap
- ): Boolean {
- if (firstEnchants.size != resultEnchants.size) return false
- for (entry in resultEnchants) {
- if (firstEnchants.getOrDefault(entry.key, entry.value - 1) != entry.value) return false
- }
-
- return true
- }
-
- // return true if a custom recipe exist with these ingredients
- fun testCustomRecipe(
- view: InventoryView, //TODO use anvil view instead
- inventory: AnvilInventory,
- player: Player,
- first: ItemStack, second: ItemStack?
- ): CustomCraftResult {
- val recipe = CustomRecipeUtil.getCustomRecipe(first, second)
- CustomAnvil.verboseLog("custom recipe not null? ${recipe != null}")
- if (recipe == null) return CustomCraftResult.EMPTY
-
- val amount = CustomRecipeUtil.getCustomRecipeAmount(recipe, first, second)
-
- val resultItem: ItemStack = DependencyManager.cloneItem(player, recipe.resultItem!!)
- resultItem.amount *= amount
-
- // Maybe add an option on custom craft to ignore/not ignore penalty ??
- val xpCost = recipe.determineCost(amount, first, resultItem)
-
- val cost = CustomCraftCost(xpCost)
- // This is for displayed cost
- cost.recipe = if (recipe.removeExactLinearXp) AnvilXpUtil.calculateMinimumLevelForXp(xpCost)
- else AnvilXpUtil.calculateLevelForXp(xpCost)
-
- val result =
- DependencyManager.tryTreatAnvilResult(view, inventory, player, resultItem, AnvilUseType.CUSTOM_CRAFT, cost)
- return CustomCraftResult(result, cost, amount, recipe)
- }
-
- fun testUnitRepair(
- view: InventoryView, //TODO use anvil view
- inventory: AnvilInventory,
- player: Player,
- first: ItemStack, second: ItemStack
- ): UnitRepairResult {
- val unitRepairAmount = first.getRepair(second) ?: return UnitRepairResult.EMPTY
-
- return testUnitRepair(view, inventory, player, first, second, unitRepairAmount)
- }
-
- fun testUnitRepair(
- view: InventoryView, //TODO use anvil view instead
- inventory: AnvilInventory,
- player: Player,
- first: ItemStack, second: ItemStack,
- unitRepairAmount: Double
- ): UnitRepairResult {
- val resultItem = DependencyManager.cloneItem(player, first)
- val cost = AnvilCost()
- cost.rename = handleRename(resultItem, inventory, player)
-
- val repairAmount = resultItem.unitRepair(second.amount, unitRepairAmount)
- if (repairAmount > 0)
- cost.repair = repairAmount * ConfigOptions.unitRepairCost
-
- // We do not care about right item penalty for unit repair
- cost.workPenalty = AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.UNIT_REPAIR)
-
- // Test/stop if nothing changed.
- if (first == resultItem) {
- CustomAnvil.log("unit repair, But input is same as output")
- return UnitRepairResult.EMPTY
- }
-
- val result =
- DependencyManager.tryTreatAnvilResult(view, inventory, player, resultItem, AnvilUseType.UNIT_REPAIR, cost)
- return UnitRepairResult(result, cost, repairAmount)
- }
-
- fun testLoreEdit(
- player: Player,
- first: ItemStack, second: ItemStack
- ): LoreEditResult {
- val type = second.type
-
- val result = if (Material.WRITABLE_BOOK == type)
- AnvilLoreEditUtil.tryLoreEditByBook(player, first, second)
- else if (Material.PAPER == type)
- AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second)
- else LoreEditResult.EMPTY
-
- if (result.isEmpty()) return result
-
- if (result.item!!.isAir || first == result.item) {
- CustomAnvil.log("lore edit, But input is same as output")
- return LoreEditResult.EMPTY
- }
-
- return result
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/CASubCommand.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/CASubCommand.kt
deleted file mode 100644
index 4c71c68..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/CASubCommand.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package xyz.alexcrea.cuanvil.command
-
-import org.bukkit.ChatColor
-import org.bukkit.command.Command
-import org.bukkit.command.CommandExecutor
-import org.bukkit.command.CommandSender
-
-abstract class CASubCommand: CommandExecutor {
-
- private var alreadySaid = false;
- override fun onCommand(
- sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array
- ): Boolean {
- if(!alreadySaid){
- sender.sendMessage(ChatColor.RED.toString() +
- "Please not that this command will be replaced as a subcommand of `/customanvil` or `/ca`")
- alreadySaid = true
- }
-
- return executeCommand(sender, cmd, cmdstr, args)
- }
-
- abstract fun executeCommand(
- sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array): Boolean
-
- open fun allowed(sender: CommandSender): Boolean {
- return true
- }
-
- open fun tabCompleter(
- sender: CommandSender,
- args: Array,
- list: MutableList) {
- }
-
- open fun description(): String {
- return "no description"
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt
deleted file mode 100644
index e5e689e..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/CustomAnvilCommand.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-package xyz.alexcrea.cuanvil.command
-
-import com.google.common.collect.ImmutableMap
-import io.delilaheve.CustomAnvil
-import org.bukkit.command.Command
-import org.bukkit.command.CommandExecutor
-import org.bukkit.command.CommandSender
-import org.bukkit.command.TabCompleter
-import xyz.alexcrea.cuanvil.util.MetricsUtil
-import java.util.ArrayList
-
-class CustomAnvilCommand(plugin: CustomAnvil) : CommandExecutor, TabCompleter {
-
- // Name of the generic command
- companion object {
- private const val genericCommandName = "customanvil"
- }
-
- private val editConfigCommand = EditConfigExecutor()
- private val helpCommand = HelpExecutor()
- private val commands = ImmutableMap.of(
- "gui", editConfigCommand,
- "reload", ReloadExecutor(),
- "diagnostic", DiagnosticExecutor(),
- "help", helpCommand,
- )
-
- init {
- val self = plugin.getCommand(genericCommandName)!!
- self.setExecutor(this)
- self.tabCompleter = this
-
- helpCommand.commands = commands
- }
-
- override fun onCommand(
- sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array
- ): Boolean {
- // Find sub command to execute based on the provided command name
- val subcmd: CASubCommand?
- val newargs: Array
- if(args.isEmpty()) {
- subcmd = editConfigCommand
- newargs = args
- }else {
- subcmd = commands[args[0].lowercase()]
- newargs = args.copyOfRange(1, args.size)
- }
-
- if(subcmd == null || !subcmd.allowed(sender)) {
- sender.sendMessage("Invalid subcommand. run `$cmdstr help` to see available commands")
- return true
- }
-
- try {
- return subcmd.executeCommand(sender, cmd, cmdstr, newargs)
- } catch (e: Throwable) {
- MetricsUtil.trackError(e)
- sender.sendMessage("§cError running this command")
- return false
- }
- }
-
- override fun onTabComplete(
- sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array
- ): MutableList {
- val result = ArrayList()
- if(args.size < 2) {
- for ((key, cmd) in commands) {
- if(!cmd.allowed(sender)) continue
- result.add(key)
- }
- } else {
- val subcmd = commands[args[0].lowercase()]
-
- if(subcmd != null) {
- val newArgs = args.copyOfRange(1, args.size)
- if(!subcmd.allowed(sender)) return result
-
- subcmd.tabCompleter(sender, newArgs, result)
- }
- }
-
- //assumed all provided tab completed string are lowercase
- return result.stream()
- .filter { it.startsWith(args[args.size - 1]) }
- .sorted()
- .toList()
- }
-}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt
deleted file mode 100644
index 053a3fc..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt
+++ /dev/null
@@ -1,347 +0,0 @@
-package xyz.alexcrea.cuanvil.command
-
-import com.github.stefvanschie.inventoryframework.inventoryview.interface_.InventoryViewUtil
-import io.delilaheve.CustomAnvil
-import net.md_5.bungee.api.chat.ClickEvent
-import net.md_5.bungee.api.chat.HoverEvent
-import net.md_5.bungee.api.chat.TextComponent
-import net.md_5.bungee.api.chat.hover.content.Text
-import org.bukkit.Bukkit
-import org.bukkit.ChatColor
-import org.bukkit.Material
-import org.bukkit.command.Command
-import org.bukkit.command.CommandSender
-import org.bukkit.enchantments.Enchantment
-import org.bukkit.entity.HumanEntity
-import org.bukkit.entity.Player
-import org.bukkit.event.inventory.InventoryType
-import org.bukkit.event.inventory.PrepareAnvilEvent
-import org.bukkit.inventory.AnvilInventory
-import org.bukkit.inventory.InventoryView
-import org.bukkit.inventory.ItemStack
-import org.bukkit.inventory.meta.Damageable
-import org.bukkit.inventory.meta.EnchantmentStorageMeta
-import org.bukkit.plugin.Plugin
-import org.bukkit.plugin.RegisteredListener
-import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.packet.NoPacketManager
-import xyz.alexcrea.cuanvil.dependency.packet.ProtocoLibWrapper
-import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry
-import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
-import xyz.alexcrea.cuanvil.util.MetricsUtil
-import java.util.*
-import java.util.stream.Collectors
-
-
-class DiagnosticExecutor: CASubCommand() {
-
- companion object{
- private const val NO_DIAG_PERM = "You do not have permission to diagnostic this server"
-
- fun fetchNMSType(): String {
- val packetManager = DependencyManager.packetManager
- val packetManagerClass = packetManager.javaClass
-
- val className = packetManagerClass.name
- val result = if(className.contains("PaperPacket")) {
- "Paper"
- } else {
- when (packetManagerClass) {
- ProtocoLibWrapper::class.java -> "Protocolib"
- NoPacketManager::class.java -> "None"
- else -> "Version Specific"
- }
- }
-
-
- return "$result ${if(packetManager.canSetInstantBuild) '✅' else '❌'}"
- }
- }
-
- enum class DiagParams(val value: String) {
- OS_PRIVACY("os_privacy"),
- PLUGIN_PRIVACY("plugin_privacy"),
- NO_MERGE_TEST("no_merge_test"),
- FULL_ENCHANTMENT_DATA("full_enchantment_data"),
- INCLUDE_LAST_ERROR("include_last_error"),
- }
-
- private fun fetchParameters(args: Array): EnumSet {
- val result = EnumSet.noneOf(DiagParams::class.java)
- val argSet = HashSet()
-
- for (string in args) {
- argSet.add(string.lowercase())
- }
-
- for (param in DiagParams.entries) {
- if(argSet.contains(param.value))
- result.add(param)
- }
-
- return result
- }
-
- override fun tabCompleter(
- sender: CommandSender,
- args: Array,
- list: MutableList) {
- if(!allowed(sender)) return
-
- val map = fetchParameters(args)
- for (param in DiagParams.entries) {
- if(!map.contains(param))
- list.add(param.value)
- }
-
- }
-
- override fun executeCommand(
- sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array
- ): Boolean {
- if (!allowed(sender)) {
- sender.sendMessage(NO_DIAG_PERM)
- return false
- }
-
- val stb = StringBuilder("```\n")
- val params = fetchParameters(args)
- var hasError = false
- try {
- diagnostic(sender, stb, params)
- } catch(e: Throwable){
- stb.append("\n\nError happened trying to get diagnostic data:\n")
- .append(e.message).append("\n")
- .append(e.stackTrace.joinToString("\n"))
- hasError = true
- e.printStackTrace()
- }
-
- stb.append("\n```")
-
- if (sender is HumanEntity) {
- if(hasError)
- sender.spigot().sendMessage(TextComponent(ChatColor.RED.toString() + "There was an error running the diagnostic"))
- val message = TextComponent(ChatColor.GREEN.toString() + "Click to copy diagnostic data")
-
- message.clickEvent = ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, stb.toString())
- message.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, Text("§7Click to copy"))
-
- sender.spigot().sendMessage(message);
- } else {
- sender.sendMessage(stb.toString());
- }
-
- return true
- }
-
- override fun allowed(sender: CommandSender): Boolean {
- return sender.hasPermission(CustomAnvil.diagnosticPermission)
- }
-
- fun diagnostic(sender: CommandSender, stb: StringBuilder, params: Set){
- stb.append("Server Info\n")
- val version = CustomAnvil.instance.description.version
- stb.append("\nPlugin Version: ").append(version)
- if(version.contains("dev")) stb.append(" (alpha)")
-
- stb.append("\nLatest Update: ").append(CustomAnvil.latestVer)
- stb.append("\nServer Version: ").append(Bukkit.getVersion()).append(" (").append(Bukkit.getName()).append(')')
- stb.append("\nPlugin Enabled: ").append(if(CustomAnvil.instance.isEnabled) "Yes" else "No")
- stb.append("\nNMS type: ").append(fetchNMSType())
- if(!params.contains(DiagParams.OS_PRIVACY)) {
- stb.append("\nJava Version: ").append(System.getProperty("java.version"))
- stb.append("\nOS: ").append(System.getProperty("os.name")).append(" ")
- .append(System.getProperty("os.version"))
- .append(System.getProperty("os.arch"))
- }
-
- stb.append("\nHad detect error: ").append(if(MetricsUtil.lastError != null) "Yes" else "No")
-
- if(!params.contains(DiagParams.PLUGIN_PRIVACY)) {
- pluginListDiag(sender, stb)
- }
- prepareAnvilListeners(stb)
-
- if(!params.contains(DiagParams.NO_MERGE_TEST)){
- if(sender is Player) testMerge(sender, stb)
- }
-
- stb.append("\n\nEnchantments data:")
- partialEnchantmentData(stb)
- if(params.contains(DiagParams.FULL_ENCHANTMENT_DATA)){
- fullEnchantmentData(stb)
- }
-
- if(params.contains(DiagParams.INCLUDE_LAST_ERROR)){
- includeLastError(stb)
- }
- }
-
- private fun testMerge(player: Player, stb: StringBuilder) {
- val sword = ItemStack(Material.DIAMOND_SWORD)
- val damagedSword = sword.clone()
- val enchantedSword = sword.clone()
- val enchantedBook = ItemStack(Material.ENCHANTED_BOOK)
- val unitForRepair = ItemStack(Material.DIAMOND)
-
- var meta = damagedSword.itemMeta
- (meta as Damageable).damage = 5
- damagedSword.itemMeta = meta
-
- meta = enchantedSword.itemMeta
- meta!!.addEnchant(Enchantment.DAMAGE_ALL, 1, true)
- enchantedSword.itemMeta = meta
-
- meta = enchantedBook.itemMeta
- (meta as EnchantmentStorageMeta).addStoredEnchant(Enchantment.DAMAGE_ALL, 1, true)
- enchantedBook.itemMeta = meta
-
- stb.append("\n\nItem to Item repair:")
- simulateAnvil(player, stb, damagedSword, damagedSword, sword)
-
- stb.append("\n\nUnit repair:")
- simulateAnvil(player, stb, damagedSword, unitForRepair, sword)
-
- stb.append("\n\nEnchanting an item:")
- simulateAnvil(player, stb, sword, enchantedBook, enchantedSword)
- }
-
- private val Plugin.pluginNameDisplay: String
- get() {
- return this.name + " v" + this.description.version
- }
-
- override fun description(): String {
- return "Basic diagnostic of this plugin"
- }
-
- private fun pluginListDiag(sender: CommandSender, stb: StringBuilder) {
- val enabledPlugins: MutableList = ArrayList()
- val disabledPlugins: MutableList = ArrayList()
- for (plugin in Bukkit.getPluginManager().plugins) {
- if (plugin.isEnabled) {
- enabledPlugins.add(plugin)
- } else {
- disabledPlugins.add(plugin)
- }
- }
-
- stb.append("\nEnabled Plugins: ").append(
- enabledPlugins.stream()
- .map { plugin -> plugin!!.pluginNameDisplay }
- .reduce { a: String?, b: String? -> "$a, $b" }.orElse("None")
- )
-
- stb.append("\nDisabled Plugins: ").append(
- disabledPlugins.stream()
- .map { plugin -> plugin!!.pluginNameDisplay }
- .reduce { a: String?, b: String? -> "$a, $b" }.orElse("None")
- )
- }
-
- fun prepareAnvilListeners(stb: StringBuilder) {
- val eventListeners: MutableSet = Arrays
- .stream(
- PrepareAnvilEvent
- .getHandlerList()
- .getRegisteredListeners()
- )
- .map { obj: RegisteredListener? -> obj!!.plugin }
- .collect(Collectors.toSet())
-
- eventListeners.remove(CustomAnvil.instance)
- stb.append("\nPrepare Anvil Listeners: ").append(
- if (eventListeners.isEmpty()) "None" else eventListeners.stream()
- .map { plugin -> plugin!!.pluginNameDisplay }
- .reduce { a: String?, b: String? -> "$a, $b" }.orElse("None")
- )
- }
-
- fun simulateAnvil(player: Player, stb: StringBuilder, left: ItemStack?, right: ItemStack?, result: ItemStack?) {
- var invView: InventoryView
- var event: PrepareAnvilEvent
- try {
- val fakeInv = Bukkit.createInventory(player, InventoryType.ANVIL)
- invView = player.openInventory(fakeInv)!!
- event = PrepareAnvilEvent(invView, result)
- } catch (e: Throwable) {
- // Help
- val menuTypeClazz = Class.forName("org.bukkit.inventory.MenuType")
- val anvilTypeField = menuTypeClazz.getField("ANVIL")
- val anvilType = anvilTypeField.get(null)
- val createMethod = anvilType.javaClass.getMethod("create", HumanEntity::class.java)
- invView = createMethod.invoke(anvilType, player) as InventoryView
-
- player.openInventory(invView)
-
- val anvilViewClass = Class.forName("org.bukkit.inventory.view.AnvilView")
- val constructor = PrepareAnvilEvent::class.java.getConstructor(anvilViewClass, ItemStack::class.java)
- event = constructor.newInstance(invView, result)
- }
-
- val fakeInv = InventoryViewUtil.getInstance().getTopInventory(invView) as AnvilInventory
- fakeInv.setItem(0, left)
- fakeInv.setItem(1, right)
-
- val xp = fakeInv.repairCost
- val maxXp = fakeInv.maximumRepairCost
- val mergeResult = fakeInv.getItem(2)
- stb.append("\n${if(result == mergeResult) "E" else "Une"}xpected Result")
-
- PrepareAnvilListener().anvilCombineCheck(event)
- // Now we check if item and xp same
- stb.append("\nXP/Max XP: ")
- .append(if(fakeInv.repairCost == xp) "Correct" else "Incorrect")
- .append("/")
- .append(if(fakeInv.maximumRepairCost == maxXp) "Correct" else "Incorrect")
- .append(" (${fakeInv.repairCost} $xp|${fakeInv.maximumRepairCost} $maxXp)")
- .append("\nMerge result: ")
- .append(if(fakeInv.getItem(2) == mergeResult) "Correct" else "Incorrect")
-
- PrepareAnvilListener.IS_EMPTY_TEST = true
- Bukkit.getPluginManager().callEvent(event)
- stb.append("\nNull result test: ")
- .append(if(event.result == null) "Correct" else "Incorrect")
-
- fakeInv.setItem(0, null)
- fakeInv.setItem(1, null)
- fakeInv.setItem(2, null)
- player.closeInventory()
- }
-
- private fun fullEnchantmentData(stb: StringBuilder) {
- for (enchantment in CAEnchantmentRegistry.getInstance().values()) {
- stb.append("\n- ").append(enchantment.key.toString())
- .append(" ").append(enchantment.name)
- .append(" ").append(enchantment.defaultMaxLevel())
- }
- }
-
- private fun partialEnchantmentData(stb: StringBuilder) {
- val map = HashMap()
- for (enchant in CAEnchantmentRegistry.getInstance().values()) {
- map[enchant.key.namespace] = map.getOrDefault(enchant.key.namespace, 0) + 1
- }
-
- stb.append("\nNamespaces: ${
- map.entries.stream()
- .map { (key, value) -> "$key ($value)" }
- .reduce { a, b -> "$a, $b" }.get()
- }")
-
- }
-
- private fun includeLastError(stb: StringBuilder) {
- val e = MetricsUtil.lastError ?: return
-
- stb.append("\n\nLast stack trace: ${e.stackTraceToString()}")
-
-
-
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
index fba89b7..f90f765 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
@@ -2,21 +2,17 @@ package xyz.alexcrea.cuanvil.command
import io.delilaheve.CustomAnvil
import org.bukkit.command.Command
+import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender
import org.bukkit.entity.HumanEntity
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions
-class EditConfigExecutor: CASubCommand() {
+class EditConfigExecutor : CommandExecutor {
- override fun executeCommand(sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array): Boolean {
- if (sender !is HumanEntity) return false
-
- if (!allowed(sender)) {
+ override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean {
+ if (!sender.hasPermission(CustomAnvil.editConfigPermission)) {
sender.sendMessage(GuiGlobalActions.NO_EDIT_PERM)
return false
}
@@ -29,17 +25,10 @@ class EditConfigExecutor: CASubCommand() {
return false
}
+ if (sender !is HumanEntity) return false
MainConfigGui.getInstance().show(sender)
return true
}
- override fun allowed(sender: CommandSender): Boolean {
- return sender.hasPermission(CustomAnvil.editConfigPermission)
- }
-
- override fun description(): String {
- return "Gui to edit the plugin's config"
- }
-
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/HelpExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/HelpExecutor.kt
deleted file mode 100644
index 697f1ee..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/HelpExecutor.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package xyz.alexcrea.cuanvil.command
-
-import com.google.common.collect.ImmutableMap
-import org.bukkit.command.Command
-import org.bukkit.command.CommandSender
-
-class HelpExecutor: CASubCommand() {
-
- lateinit var commands: ImmutableMap
-
- override fun executeCommand(sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array): Boolean {
-
- val stb = StringBuilder("List of available commands:")
- for ((key, cmd) in commands) {
- if(!cmd.allowed(sender)) continue
-
- stb.append("\n- $key: ").append(cmd.description())
- }
-
- sender.sendMessage(stb.toString())
-
- return true
- }
-
- override fun description(): String {
- return "Help command"
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt
index ef23e7d..dc2fe8e 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt
@@ -11,13 +11,9 @@ import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.gui.config.global.*
import xyz.alexcrea.cuanvil.update.UpdateHandler
-class ReloadExecutor : CASubCommand() {
-
- override fun executeCommand(sender: CommandSender,
- cmd: Command,
- cmdstr: String,
- args: Array): Boolean {
- if (!allowed(sender)) {
+class ReloadExecutor : CommandExecutor {
+ override fun onCommand(sender: CommandSender, cmd: Command, cmdstr: String, args: Array): Boolean {
+ if (!sender.hasPermission(CustomAnvil.commandReloadPermission)) {
sender.sendMessage("§cYou do not have permission to reload the config")
return false
}
@@ -35,14 +31,6 @@ class ReloadExecutor : CASubCommand() {
return commandSuccess
}
- override fun allowed(sender: CommandSender): Boolean {
- return sender.hasPermission(CustomAnvil.commandReloadPermission)
- }
-
- override fun description(): String {
- return "Reload the configuration of this plugin"
- }
-
/**
* Execute the command, return true if success or false otherwise
*/
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt
index b730a0e..66a9aa5 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt
@@ -1,28 +1,23 @@
package xyz.alexcrea.cuanvil.dependency
-import com.maddoxh.superEnchants.SuperEnchants
+import com.willfp.eco.core.gui.player
import io.delilaheve.CustomAnvil
import net.kyori.adventure.text.Component
import org.bukkit.Bukkit
import org.bukkit.ChatColor
-import org.bukkit.command.CommandSender
import org.bukkit.entity.HumanEntity
-import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory
-import org.bukkit.inventory.Inventory
-import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack
-import xyz.alexcrea.cuanvil.anvil.AnvilCost
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType
import xyz.alexcrea.cuanvil.api.event.listener.CAClickResultBypassEvent
import xyz.alexcrea.cuanvil.api.event.listener.CAEarlyPreAnvilBypassEvent
import xyz.alexcrea.cuanvil.api.event.listener.CAPreAnvilBypassEvent
-import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResult2Event
+import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResultEvent
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.dependency.datapack.DataPackDependency
-import xyz.alexcrea.cuanvil.dependency.gui.GenericExternGuiTester
+import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester
+import xyz.alexcrea.cuanvil.dependency.gui.GuiTesterSelector
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerSelector
import xyz.alexcrea.cuanvil.dependency.plugins.*
@@ -32,14 +27,14 @@ import xyz.alexcrea.cuanvil.dependency.scheduler.TaskScheduler
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.componentLore
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT
-import xyz.alexcrea.cuanvil.util.MetricsUtil.trackError
+import xyz.alexcrea.cuanvil.util.AnvilUseType
import java.util.logging.Level
object DependencyManager {
lateinit var scheduler: TaskScheduler
lateinit var packetManager: PacketManager
- var externGuiTester: GenericExternGuiTester = GenericExternGuiTester()
+ var externGuiTester: ExternGuiTester? = null
var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null
var ecoEnchantCompatibility: EcoEnchantDependency? = null
@@ -50,8 +45,6 @@ object DependencyManager {
var axPlayerWarpsCompatibility: AxPlayerWarpsDependency? = null
- var itemsAdderCompatibility: ItemsAdderDependency? = null
-
val genericDependencies = ArrayList()
fun loadDependency() {
@@ -67,6 +60,7 @@ object DependencyManager {
// Packet Manager
val forceProtocolib = ConfigHolder.DEFAULT_CONFIG.config.getBoolean("force_protocolib", false)
packetManager = PacketManagerSelector.selectPacketManager(forceProtocolib)
+ externGuiTester = GuiTesterSelector.selectGuiTester
// Enchantment Squared dependency
if (pluginManager.isPluginEnabled("EnchantsSquared")) {
@@ -103,12 +97,6 @@ object DependencyManager {
axPlayerWarpsCompatibility = AxPlayerWarpsDependency()
}
- if (pluginManager.isPluginEnabled("ItemsAdder")){
- val dependency = ItemsAdderDependency(pluginManager.getPlugin("ItemsAdder")!!)
- itemsAdderCompatibility = dependency
- genericDependencies.add(dependency)
- }
-
// "Generic" dependencies
if (pluginManager.isPluginEnabled("ToolStats"))
genericDependencies.add(ToolStatsDependency(pluginManager.getPlugin("ToolStats")!!))
@@ -116,12 +104,6 @@ object DependencyManager {
if (pluginManager.isPluginEnabled("ItemsAdder"))
genericDependencies.add(GenericPluginDependency(pluginManager.getPlugin("ItemsAdder")!!))
- if (pluginManager.isPluginEnabled("SuperEnchants")){
- val compatibility = SuperEnchantDependency(pluginManager.getPlugin("SuperEnchants")!! as SuperEnchants)
- if(compatibility.registerEnchantments())
- genericDependencies.add(compatibility)
- }
-
for (dependency in genericDependencies)
dependency.redirectListeners()
@@ -149,35 +131,26 @@ object DependencyManager {
ecoEnchantCompatibility?.handleConfigReload()
}
- private fun logException(target: CommandSender, e: Exception) {
- CustomAnvil.instance.logger.log(
- Level.SEVERE,
- "Error while trying to handle custom anvil supported plugin: ",
- e
- )
- trackError(e)
-
- // Finally, warn the player
- target.sendMessage(
- "[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " +
- ChatColor.RED.toString() + "Error while handling the anvil."
- )
- }
-
- private fun logExceptionAndClear(target: CommandSender, inventory: Inventory, e: Exception) {
- // Just in case to avoid illegal items
- inventory.setItem(ANVIL_OUTPUT_SLOT, null)
-
- logException(target, e)
- }
-
// Return true if should bypass (either by a dependency or error)
// called before immutability test
fun earlyTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
try {
return earlyUnsafeTryEventPreAnvilBypass(event, player)
} catch (e: Exception) {
- logExceptionAndClear(event.view.player, event.inventory, e)
+ CustomAnvil.instance.logger.log(
+ Level.SEVERE,
+ "Error while trying to handle custom anvil supported plugin: ",
+ e
+ )
+
+ // Just in case to avoid illegal items
+ event.inventory.setItem(ANVIL_OUTPUT_SLOT, null)
+
+ // Finally, warn the player, maybe a lot of time but better warn than do nothing
+ event.view.player.sendMessage(
+ "[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " +
+ ChatColor.RED.toString() + "Error while handling the anvil."
+ )
return true
}
}
@@ -190,7 +163,7 @@ object DependencyManager {
var bypass = bypassEvent.isCancelled
// Test if the inventory is a gui(version specific)
- if (!bypass && externGuiTester.testIfGui(event.view)) bypass = true
+ if (!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true
// Test if in an ax player warp rating gui
if (!bypass && (axPlayerWarpsCompatibility?.testIfGui(player) == true)) bypass = true
@@ -199,16 +172,29 @@ object DependencyManager {
}
// Return true if should bypass (either by a dependency or error)
- fun tryEventPreAnvilBypass(event: PrepareAnvilEvent, player: Player): Boolean {
+ fun tryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
try {
return unsafeTryEventPreAnvilBypass(event, player)
} catch (e: Exception) {
- logExceptionAndClear(event.view.player, event.inventory, e)
+ CustomAnvil.instance.logger.log(
+ Level.SEVERE,
+ "Error while trying to handle custom anvil supported plugin: ",
+ e
+ )
+
+ // Just in case to avoid illegal items
+ event.inventory.setItem(ANVIL_OUTPUT_SLOT, null)
+
+ // Finally, warn the player, maybe a lot of time but better warn than do nothing
+ event.view.player.sendMessage(
+ "[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " +
+ ChatColor.RED.toString() + "Error while handling the anvil."
+ )
return true
}
}
- private fun unsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: Player): Boolean {
+ private fun unsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
// Run the event
val bypassEvent = CAPreAnvilBypassEvent(event)
Bukkit.getPluginManager().callEvent(bypassEvent)
@@ -233,24 +219,35 @@ object DependencyManager {
// Return null if there was an issue
fun tryTreatAnvilResult(
- view: InventoryView,
- inventory: Inventory, // TODO REMOVE, use view instead on legacy removal
- player: HumanEntity,
+ event: PrepareAnvilEvent,
result: ItemStack,
useType: AnvilUseType,
- cost: AnvilCost
- ): ItemStack? {
- val treatEvent = CATreatAnvilResult2Event(view, inventory, useType, result, cost)
+ cost: Int
+ ): CATreatAnvilResultEvent? {
+ val treatEvent = CATreatAnvilResultEvent(event, useType, result, cost)
try {
unsafeTryTreatAnvilResult(treatEvent)
- return treatEvent.result
+ return treatEvent;
} catch (e: Exception) {
- logExceptionAndClear(player, inventory, e)
+ CustomAnvil.instance.logger.log(
+ Level.SEVERE,
+ "Error while trying to handle custom anvil supported plugin: ",
+ e
+ )
+
+ // Just in case to avoid illegal items
+ event.inventory.setItem(ANVIL_OUTPUT_SLOT, null)
+
+ // Finally, warn the player, maybe a lot of time but better warn than do nothing
+ event.view.player.sendMessage(
+ "[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " +
+ ChatColor.RED.toString() + "Error while handling the anvil."
+ )
return null
}
}
- private fun unsafeTryTreatAnvilResult(event: CATreatAnvilResult2Event) {
+ private fun unsafeTryTreatAnvilResult(event: CATreatAnvilResultEvent) {
Bukkit.getPluginManager().callEvent(event)
excellentEnchantsCompatibility?.treatAnvilResult(event)
@@ -261,7 +258,20 @@ object DependencyManager {
try {
return unsafeTryClickAnvilResultBypass(event, inventory)
} catch (e: Exception) {
- logExceptionAndClear(event.view.player, event.inventory, e)
+ CustomAnvil.instance.logger.log(
+ Level.SEVERE,
+ "Error while trying to handle custom anvil supported plugin: ",
+ e
+ )
+
+ // Just in case to avoid illegal items
+ event.inventory.setItem(ANVIL_OUTPUT_SLOT, null)
+
+ // Finally, warn the player, maybe a lot of time but better warn than do nothing
+ event.whoClicked.sendMessage(
+ "[" + ChatColor.YELLOW.toString() + "CustomAnvil" + ChatColor.WHITE.toString() + "] " +
+ ChatColor.RED.toString() + "Error while handling the anvil."
+ )
return true
}
}
@@ -287,31 +297,14 @@ object DependencyManager {
}
// Test if the inventory is a gui(version specific)
- if (!bypass && externGuiTester.testIfGui(event.view)) bypass = true
+ if (!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true
// Test if in an ax player warp rating gui
- if (!bypass && (axPlayerWarpsCompatibility?.testIfGui(event.view.player) == true)) bypass = true
+ if (!bypass && (axPlayerWarpsCompatibility?.testIfGui(event.player) == true)) bypass = true
return bypass
}
- // Clone item and use plugin specific clone if needed
- fun cloneItem(player: HumanEntity, item: ItemStack): ItemStack {
- try {
- return unsafeCloneItem(item)
- } catch (e: Exception) {
- logException(player, e)
- return item.clone()
- }
- }
-
- private fun unsafeCloneItem(item: ItemStack): ItemStack {
- val cloned = itemsAdderCompatibility?.tryClone(item)
- if(cloned != null) return cloned
-
- return item.clone()
- }
-
fun stripLore(item: ItemStack): MutableList {
val dummy = item.clone()
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt
index cbd2209..69ec546 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt
@@ -6,29 +6,29 @@ object MinecraftVersionUtil {
val craftbukkitVersion: String?
get() {
- val version = UpdateUtils.currentMinecraftVersion()
- if (version.major != 1) return null
+ val versionParts = UpdateUtils.currentMinecraftVersionArray()
+ if (versionParts[0] != 1) return null
- return when (version.minor) {
- 17 -> when (version.patch) {
+ return when (versionParts[1]) {
+ 17 -> when (versionParts[2]) {
0, 1 -> "1_17R1"
else -> null
}
- 18 -> when (version.patch) {
+ 18 -> when (versionParts[2]) {
0, 1 -> "1_18R1"
2 -> "1_18R2"
else -> null
}
- 19 -> when (version.patch) {
+ 19 -> when (versionParts[2]) {
0, 1, 2 -> "1_19R1"
3 -> "1_19R2"
4 -> "1_19R3"
else -> null
}
- 20 -> when (version.patch) {
+ 20 -> when (versionParts[2]) {
0, 1 -> "1_20R1"
2 -> "1_20R2"
3, 4 -> "1_20R3"
@@ -36,7 +36,7 @@ object MinecraftVersionUtil {
else -> null
}
- 21 -> when (version.patch) {
+ 21 -> when (versionParts[2]) {
0, 1 -> "1_21R1"
2, 3 -> "1_21R2"
4 -> "1_21R3"
@@ -51,8 +51,4 @@ object MinecraftVersionUtil {
}
}
- val isTooNewForSpigot: Boolean get() {
- return UpdateUtils.currentMinecraftVersion().major != 1
- }
-
}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt
index 6d54456..f397200 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt
@@ -17,7 +17,7 @@ import xyz.alexcrea.cuanvil.update.Version
import java.io.InputStreamReader
object DataPackDependency {
- private val START_DETECT_VERSION = Version(1, 20, 5)
+ private val START_DETECT_VERSION = Version(1, 19, 0)
/**
* Map of the latest CustomAnvil update related to the pack
@@ -145,7 +145,7 @@ object DataPackDependency {
CustomAnvil.instance.logger.warning("Could not find material $name for item group $groupName")
continue
}
- group.addToPolicy(mat.key)
+ group.addToPolicy(mat)
}
for (name in section.getStringList("groups")) {
val otherGroup = MaterialGroupApi.getGroup(name)
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/EconomyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/EconomyManager.kt
deleted file mode 100644
index 67a6c1e..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/EconomyManager.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.economy
-
-import org.bukkit.entity.Player
-import org.bukkit.plugin.Plugin
-import java.math.BigDecimal
-
-interface EconomyManager {
-
- companion object {
- var economy: EconomyManager? = null
-
- fun setupEconomy(plugin: Plugin) {
- if (plugin.server.pluginManager.getPlugin("Vault") == null)
- return
- if (UnlockedEconomyManager.unlockedAvailable())
- economy = UnlockedEconomyManager(plugin)
-
- if (economy == null || !economy!!.initialized())
- economy = VaultEconomyManager(plugin)
- }
-
- }
-
- fun initialized(): Boolean
-
- // We assume "initialized" got checked before these function get called
- fun has(player: Player, money: BigDecimal): Boolean
- fun remove(player: Player, money: BigDecimal): Boolean
-
- fun format(money: BigDecimal): String;
-
-}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/UnlockedEconomyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/UnlockedEconomyManager.kt
deleted file mode 100644
index da66f30..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/UnlockedEconomyManager.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.economy
-
-import io.delilaheve.util.ConfigOptions
-import net.milkbowl.vault2.economy.Economy
-import org.bukkit.entity.Player
-import org.bukkit.plugin.Plugin
-import java.math.BigDecimal
-
-class UnlockedEconomyManager : EconomyManager {
-
- val plugin: String
- val economy: Economy?
-
- companion object {
- fun unlockedAvailable(): Boolean {
- try {
- Class.forName("net.milkbowl.vault2.economy.Economy")
- return true
- } catch (_: ClassNotFoundException) {
- return false
- }
- }
- }
-
- constructor(plugin: Plugin) {
- this.plugin = plugin.name
-
- val rsp = plugin.server.servicesManager.getRegistration(Economy::class.java)
- economy = rsp?.getProvider()
- }
-
- override fun initialized(): Boolean {
- return economy != null
- }
-
- private fun currency(): String {
- val configured = ConfigOptions.usedCurrency
-
- return if ("default".equals(configured, true))
- economy!!.getDefaultCurrency(plugin)
- else configured
- }
-
- override fun has(player: Player, money: BigDecimal): Boolean {
- if (money.signum() <= 0) return true
-
- return economy!!.has(
- plugin,
- player.uniqueId,
- player.world.name,
- currency(),
- money
- )
- }
-
- override fun remove(player: Player, money: BigDecimal): Boolean {
- if (money.signum() <= 0) return true
-
- return economy!!.withdraw(
- plugin,
- player.uniqueId,
- player.world.name,
- currency(),
- money
- )
- .transactionSuccess()
- }
-
- override fun format(money: BigDecimal): String {
- return economy!!.format(plugin, money, currency())
- }
-
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/VaultEconomyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/VaultEconomyManager.kt
deleted file mode 100644
index 058485e..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/economy/VaultEconomyManager.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.economy
-
-import net.milkbowl.vault.economy.Economy
-import org.bukkit.entity.Player
-import org.bukkit.plugin.Plugin
-import java.math.BigDecimal
-
-class VaultEconomyManager : EconomyManager {
-
- val economy: Economy?
-
- constructor(plugin: Plugin) {
- val rsp = plugin.server.servicesManager.getRegistration(Economy::class.java)
- economy = rsp?.getProvider()
- }
-
- override fun initialized(): Boolean {
- return economy != null
- }
-
- override fun has(player: Player, money: BigDecimal): Boolean {
- if (money.signum() <= 0) return true
-
- return economy!!.has(player, money.toDouble())
- }
-
- override fun remove(player: Player, money: BigDecimal): Boolean {
- if (money.signum() <= 0) return true
-
- return economy!!.withdrawPlayer(player, money.toDouble()).transactionSuccess()
- }
-
- override fun format(money: BigDecimal): String {
- return economy!!.format(money.toDouble())
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt
index 4046f4a..4ff3354 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt
@@ -1,18 +1,14 @@
package xyz.alexcrea.cuanvil.dependency.gui
import org.bukkit.inventory.InventoryView
-import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil
-import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
import java.lang.reflect.Method
-class GenericExternGuiTester {
+class GenericExternGuiTester: ExternGuiTester {
companion object {
private const val ANVIL_CLASS_NAME = "org.bukkit.craftbukkit.inventory.view.CraftAnvilView"
private const val INV_CLASS_NAME = "org.bukkit.craftbukkit.inventory.CraftInventoryView"
private const val HANDLE_METHOD_NAME = "getHandle"
-
- private const val CANONICAL_PAPER_ANVIL_MENU = "net.minecraft.world.inventory.AnvilMenu"
}
var testExist = false
@@ -21,7 +17,11 @@ class GenericExternGuiTester {
var testedClass: String? = null
lateinit var getHandleMethod: Method
- private fun getContainerClass(view: InventoryView): Class? {
+ override fun getContainerClass(view: InventoryView): Class? {
+ // In case we are in a test environment
+ if(!testExist) testClassExist()
+ if(inTesting) return view.javaClass //TEMPORARY
+
if(!testedClass.contentEquals(view.javaClass.name))
return null
@@ -36,11 +36,6 @@ class GenericExternGuiTester {
getHandleMethod = clazz.getMethod(HANDLE_METHOD_NAME)
}
- fun isInTest(): Boolean {
- if(!testExist) testClassExist()
- return inTesting
- }
-
fun testClassExist() {
testExist = true
@@ -63,49 +58,4 @@ class GenericExternGuiTester {
inTesting = true
}
- // Try if were in another plugin anvil inventory
- fun testIfGui(inventory: InventoryView): Boolean {
- // In case we are in a test environment
- if(isInTest()) return false
-
- val clazz = getContainerClass(inventory) ?: return false
-
- val clazzName = clazz.name
- if(!PlatformUtil.isPaper){
- // Blacklist gui causing issue
- if (expectWesjd(clazzName)) return true
- if (expectXenondevUI(clazzName)) return true
- if (expectVanePortal(clazzName)) return true
-
- return false
- }
-
- // Only allow cannonical anvil menu class
- return !CANONICAL_PAPER_ANVIL_MENU.equals(clazzName, true)
- }
-
- // Known custom implementations
- fun expectWesjd(name: String): Boolean {
- val expectedWesjdGuiPath = "anvilgui.version.Wrapper${MinecraftVersionUtil.craftbukkitVersion}"
-
- return name.contains(expectedWesjdGuiPath)
- }
-
- private val XenondevUIPrefix: String
- get() = "xyz.xenondevs.inventoryaccess."
- private val XenondevUISufix: String
- get() = ".AnvilInventoryImpl"
-
- fun expectXenondevUI(name: String): Boolean {
- return name.startsWith(XenondevUIPrefix)
- && name.endsWith(XenondevUISufix)
- }
-
- fun expectVanePortal(name: String): Boolean {
- val expected = "org.oddlama.vane.core.menu.AnvilMenu\$AnvilContainer"
-
- return name == expected
- }
-
-
}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt
new file mode 100644
index 0000000..f64a7f1
--- /dev/null
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt
@@ -0,0 +1,15 @@
+package xyz.alexcrea.cuanvil.dependency.gui
+
+import xyz.alexcrea.cuanvil.update.UpdateUtils
+
+object GuiTesterSelector {
+
+ val selectGuiTester: ExternGuiTester?
+ get() {
+ val versionParts = UpdateUtils.currentMinecraftVersionArray()
+ if (versionParts[0] != 1) return null
+
+ return GenericExternGuiTester()
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt
index d74ef08..f38b9e4 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt
@@ -1,31 +1,21 @@
package xyz.alexcrea.cuanvil.dependency.packet
import org.bukkit.Bukkit
-import xyz.alexcrea.cuanvil.dependency.DependencyManager
+import su.nightexpress.nightcore.bridge.paper.PaperBridge
import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil
import xyz.alexcrea.cuanvil.dependency.packet.versions.*
+import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
import xyz.alexcrea.cuanvil.update.UpdateUtils
object PacketManagerSelector {
-
- private const val PAPER_CRAFT_PLAYER_CLASS = "org.bukkit.craftbukkit.entity.CraftPlayer"
-
fun selectPacketManager(forceProtocolib: Boolean): PacketManager {
// Try to find version
- if(DependencyManager.externGuiTester.isInTest())
- return NoPacketManager()
-
return if (forceProtocolib)
protocolibIfPresent
- else {
- try {
- Class.forName(PAPER_CRAFT_PLAYER_CLASS)
-
- return PaperPacketManager()
- } catch (_: ClassNotFoundException) {
- return reobfPacketManager ?: protocolibIfPresent
- }
- }
+ else
+ reobfPacketManager ?:
+ if(PlatformUtil.isPaper) PaperPacketManager()
+ else protocolibIfPresent
}
private val protocolibIfPresent: PacketManager
@@ -38,8 +28,8 @@ object PacketManagerSelector {
// Reobfuscated packet manager for spigot or paper as it remap
private val reobfPacketManager: PacketManagerBase?
get() {
- val versionParts = UpdateUtils.currentMinecraftVersion()
- if (versionParts.major != 1) return null
+ val versionParts = UpdateUtils.currentMinecraftVersionArray()
+ if (versionParts[0] != 1) return null
try {
val clazz = Class.forName("xyz.alexcrea.cuanvil.dependency.packet.versions." +
@@ -47,7 +37,7 @@ object PacketManagerSelector {
val manager = clazz.getConstructor().newInstance()
return manager as PacketManagerBase
- } catch (_: ClassNotFoundException) {
+ } catch (e: ClassNotFoundException) {
return null
}
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt
index 690b384..f014c8a 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt
@@ -8,16 +8,14 @@ import com.jankominek.disenchantment.events.ShatterEvent
import com.jankominek.disenchantment.listeners.DisenchantClickListener
import com.jankominek.disenchantment.listeners.ShatterClickListener
import io.delilaheve.CustomAnvil
-import org.bukkit.entity.Player
+import org.bukkit.entity.HumanEntity
import org.bukkit.event.Listener
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.ItemStack
-import xyz.alexcrea.cuanvil.anvil.AnvilCost
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
-import xyz.alexcrea.cuanvil.util.MetricsUtil.trackError
-import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
+import xyz.alexcrea.cuanvil.util.AnvilXpUtil
import java.util.logging.Level
import kotlin.reflect.KClass
@@ -40,7 +38,6 @@ class DisenchantmentDependency {
Level.SEVERE, "Could not initialize disenchantment support" +
"please report this bug to the developer", e
)
- trackError(e)
}
}
@@ -51,7 +48,7 @@ class DisenchantmentDependency {
InventoryClickEvent.getHandlerList().unregister(listener)
}
- fun testPrepareAnvil(event: PrepareAnvilEvent, player: Player): Boolean {
+ fun testPrepareAnvil(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
val previousResult = event.result
event.result = null
@@ -59,14 +56,14 @@ class DisenchantmentDependency {
DisenchantEvent.onEvent(event)
if (event.result != null) {
CustomAnvil.log("Detected pre anvil item extract bypass.")
- AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost))
+ AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
return true
}
ShatterEvent.onEvent(event)
if (event.result != null) {
CustomAnvil.log("Detected pre anvil split enchant bypass.")
- AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost))
+ AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
return true
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoItemDependencyUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoItemDependencyUtil.kt
deleted file mode 100644
index 7e84231..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoItemDependencyUtil.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.plugins
-
-import com.willfp.ecoitems.items.EcoItem
-import com.willfp.ecoitems.items.EcoItems
-import com.willfp.ecoitems.items.ecoItem
-import org.bukkit.Material
-import org.bukkit.NamespacedKey
-import org.bukkit.inventory.ItemStack
-
-object EcoItemDependencyUtil {
-
- fun ecoItemNamespace(item: ItemStack): NamespacedKey? {
- val ecoi = item.ecoItem ?: return null
-
- return ecoi.id
- }
-
- fun ecoItemFromKey(key: NamespacedKey): EcoItem? {
- return EcoItems.getByID(key.toString())
- }
-
- fun ecoItemMaterialFromKey(key: NamespacedKey): Material? {
- val ecoi = ecoItemFromKey(key) ?: return null
-
- return ecoi.itemStack.type
- }
-
- fun newEcoItemstack(key: NamespacedKey): ItemStack? {
- val ecoi = ecoItemFromKey(key) ?: return null
-
- return ecoi.itemStack
- }
-
- fun getItems(): List {
- return EcoItems.values().map { item -> item.id }
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantmentSquaredDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantmentSquaredDependency.kt
index d769986..f4da612 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantmentSquaredDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantmentSquaredDependency.kt
@@ -102,15 +102,15 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin)
private fun writeMissingGroups(){
// Write group that do not exist on custom anvil.
val shield = IncludeGroup("shield")
- shield.addToPolicy(Material.SHIELD.key)
+ shield.addToPolicy(Material.SHIELD)
MaterialGroupApi.addMaterialGroup(shield)
val elytra = IncludeGroup("elytra")
- elytra.addToPolicy(Material.ELYTRA.key)
+ elytra.addToPolicy(Material.ELYTRA)
MaterialGroupApi.addMaterialGroup(elytra)
val trinkets = IncludeGroup("trinkets")
- trinkets.addToPolicy(Material.ROTTEN_FLESH.key)
+ trinkets.addToPolicy(Material.ROTTEN_FLESH)
MaterialGroupApi.addMaterialGroup(trinkets)
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt
index 816a4df..98d80ff 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt
@@ -8,12 +8,10 @@ import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.RegisteredListener
import xyz.alexcrea.cuanvil.api.EnchantmentApi
-import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResult2Event
+import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResultEvent
import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEPreV5Enchantment
import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5Enchantment
-import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5_4Enchantment
import xyz.alexcrea.cuanvil.enchant.wrapped.CALegacyEEEnchantment
-import java.lang.reflect.Constructor
import java.lang.reflect.Method
import su.nightexpress.excellentenchants.api.EnchantRegistry as V5EnchantRegistry
import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant as LegacyCurseOfFragilityEnchant
@@ -27,7 +25,6 @@ import su.nightexpress.excellentenchants.registry.EnchantRegistry as PreV5Enchan
class ExcellentEnchantsDependency {
enum class ListenerVersion(val classPath: String) {
- V5_4("su.nightexpress.excellentenchants.enchantment.EnchantSettings"),
V5_3("su.nightexpress.excellentenchants.enchantment.EnchantRegistry"),
V5("su.nightexpress.excellentenchants.manager.listener.AnvilListener"),
PRE_V5("su.nightexpress.excellentenchants.enchantment.listener.AnvilListener"),
@@ -73,14 +70,14 @@ class ExcellentEnchantsDependency {
// As excellent enchants is loaded before custom anvil and register enchantment to registry, we need to unregister old "vanilla" enchant.
when (listenerVersion) {
- ListenerVersion.V5_4 -> {
+ ListenerVersion.V5_3 -> {
for (enchantment in ExcellentEnchant5_3Registry.getRegistered()) {
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
- EnchantmentApi.registerEnchantment(CAEEV5_4Enchantment(enchantment))
+ EnchantmentApi.registerEnchantment(CAEEV5Enchantment(enchantment))
}
}
- ListenerVersion.V5, ListenerVersion.V5_3 -> {
+ ListenerVersion.V5 -> {
for (enchantment in V5EnchantRegistry.getRegistered()) {
EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
EnchantmentApi.registerEnchantment(CAEEV5Enchantment(enchantment))
@@ -118,8 +115,6 @@ class ExcellentEnchantsDependency {
private lateinit var handleRechargeMethod: Method
private lateinit var handleCombineMethod: Method
- private val prepareAnvilConstructor = PrepareAnvilEvent::class.java.constructors.first() as Constructor
-
fun redirectListeners() {
val toUnregister = ArrayList()
// get required PrepareAnvilEvent listener
@@ -135,8 +130,7 @@ class ExcellentEnchantsDependency {
when (listenerVersion) {
ListenerVersion.V5,
- ListenerVersion.V5_3,
- ListenerVersion.V5_4,
+ ListenerVersion.V5_3
-> {
if (listener is V5AnvilListener) {
this.v5AnvilListener = listener
@@ -169,9 +163,8 @@ class ExcellentEnchantsDependency {
}
when (listenerVersion) {
- ListenerVersion.V5_3,
ListenerVersion.V5,
- ListenerVersion.V5_4,
+ ListenerVersion.V5_3
-> this.usedAnvilListener = v5AnvilListener!!
ListenerVersion.PRE_V5 -> this.usedAnvilListener = preV5AnvilListener!!
ListenerVersion.LEGACY -> this.usedAnvilListener = legacyAnvilListener!!
@@ -191,19 +184,11 @@ class ExcellentEnchantsDependency {
)
this.handleRechargeMethod.setAccessible(true)
- try {
- this.handleCombineMethod = this.usedAnvilListener.javaClass.getDeclaredMethod(
- "anvilCombine",
- PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java, ItemStack::class.java
- )
- this.handleCombineMethod.setAccessible(true)
- } catch (_: NoSuchMethodException) {
- this.handleCombineMethod = this.usedAnvilListener.javaClass.getDeclaredMethod(
- "handleCombine",
- PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java, ItemStack::class.java
- )
- this.handleCombineMethod.setAccessible(true)
- }
+ this.handleCombineMethod = this.usedAnvilListener.javaClass.getDeclaredMethod(
+ "handleCombine",
+ PrepareAnvilEvent::class.java, ItemStack::class.java, ItemStack::class.java, ItemStack::class.java
+ )
+ this.handleCombineMethod.setAccessible(true)
}
@@ -221,24 +206,21 @@ class ExcellentEnchantsDependency {
return handleRechargeMethod.invoke(this.usedAnvilListener, event, first, second) as Boolean
}
- fun treatAnvilResult(event: CATreatAnvilResult2Event) {
- val result = event.result ?: return
+ fun treatAnvilResult(event: CATreatAnvilResultEvent) {
+ val result = event.result
+ if (result == null) return
- val first: ItemStack = treatInput(event.leftItem)
- val second: ItemStack = treatInput(event.rightItem)
- val fakeEvent = prepareAnvilConstructor.newInstance(event.view, result)
+ val first: ItemStack = treatInput(event.event.inventory.getItem(0))
+ val second: ItemStack = treatInput(event.event.inventory.getItem(1))
- handleCombineMethod.invoke(this.usedAnvilListener, fakeEvent, first, second, result)
-
- event.result = fakeEvent.result
+ handleCombineMethod.invoke(this.usedAnvilListener, event.event, first, second, result)
}
fun testAnvilResult(event: InventoryClickEvent): Any {
if (event.inventory.getItem(2) != null) {
when (listenerVersion) {
ListenerVersion.V5,
- ListenerVersion.V5_3,
- ListenerVersion.V5_4,
+ ListenerVersion.V5_3
-> v5AnvilListener!!.onClickAnvil(event)
ListenerVersion.PRE_V5 -> preV5AnvilListener!!.onClickAnvil(event)
ListenerVersion.LEGACY -> legacyAnvilListener!!.onClickAnvil(event)
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt
index 62dae9b..85b66d5 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt
@@ -5,7 +5,7 @@ import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.plugin.Plugin
import org.bukkit.plugin.RegisteredListener
-open class GenericPluginDependency(protected open val plugin: Plugin, private val testPrepare: Boolean = true) {
+open class GenericPluginDependency(protected val plugin: Plugin) {
private val preAnvil = ArrayList()
private val postAnvil = ArrayList()
@@ -40,19 +40,11 @@ open class GenericPluginDependency(protected open val plugin: Plugin, private va
}
open fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean {
- if(!testPrepare) return false
-
val previousResult = event.result
event.result = null
for (registeredListener in preAnvil) {
- // We do not want error from another plugin to be our fault
- try {
- registeredListener.callEvent(event)
- } catch (e: Exception) {
- e.printStackTrace()
- }
-
+ registeredListener.callEvent(event)
if (event.result != null) return true
}
@@ -61,15 +53,8 @@ open class GenericPluginDependency(protected open val plugin: Plugin, private va
}
open fun testAnvilResult(event: InventoryClickEvent): Boolean {
- if(!testPrepare) return false
-
for (registeredListener in postAnvil) {
- // We do not want error from another plugin to be our fault
- try {
- registeredListener.callEvent(event)
- } catch (e: Exception) {
- e.printStackTrace()
- }
+ registeredListener.callEvent(event)
if (event.inventory.getItem(2) == null) return true
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt
index 6f30497..6e7cf60 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt
@@ -1,7 +1,7 @@
package xyz.alexcrea.cuanvil.dependency.plugins
import io.delilaheve.CustomAnvil
-import org.bukkit.entity.Player
+import org.bukkit.entity.HumanEntity
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory
@@ -9,9 +9,8 @@ import org.bukkit.plugin.RegisteredListener
import valorless.havenbags.HavenBags
import valorless.havenbags.features.BagSkin
import valorless.havenbags.features.BagUpgrade
-import xyz.alexcrea.cuanvil.anvil.AnvilCost
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
-import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
+import xyz.alexcrea.cuanvil.util.AnvilXpUtil
class HavenBagsDependency {
@@ -46,7 +45,7 @@ class HavenBagsDependency {
}
- fun testPrepareAnvil(event: PrepareAnvilEvent, player: Player): Boolean {
+ fun testPrepareAnvil(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
val previousResult = event.result
event.result = null
@@ -54,14 +53,14 @@ class HavenBagsDependency {
bagSkin.onPrepareAnvil(event)
if (event.result != null) {
CustomAnvil.log("Detected pre anvil heaven bag anvil skin.")
- AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost))
+ AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
return true
}
bagUpgrade.onPrepareAnvil(event)
if (event.result != null) {
CustomAnvil.log("Detected pre anvil heaven bag anvil upgrade.")
- AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost))
+ AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
return true
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ItemsAdderDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ItemsAdderDependency.kt
deleted file mode 100644
index 7f977e1..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ItemsAdderDependency.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.plugins
-
-import dev.lone.itemsadder.api.CustomStack
-import dev.lone.itemsadder.api.ItemsAdder
-import org.bukkit.NamespacedKey
-import org.bukkit.inventory.ItemStack
-import org.bukkit.plugin.Plugin
-
-class ItemsAdderDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
- var isLoaded: Boolean = false
- get() {
- if (field) return true
-
- // We can't be sure the event is registered before being triggered so we need to use this function
- field = ItemsAdder.areItemsLoaded()
- return field
- }
-
- fun tryClone(item: ItemStack): ItemStack? {
- if(!isLoaded) return null
- val customItem = CustomStack.byItemStack(item) ?: return null
-
- return CustomStack.getInstance(customItem.namespacedID)?.itemStack
- }
-
- fun fromKey(key: NamespacedKey): ItemStack? {
- if(!isLoaded) return null
- return CustomStack.getInstance(key.toString())?.itemStack
- }
-
- fun getKey(item: ItemStack) : NamespacedKey? {
- if(!isLoaded) return null
- val customItem = CustomStack.byItemStack(item) ?: return null
-
- return NamespacedKey.fromString(customItem.namespacedID)
- }
-
- fun idsCount(): Set {
- return CustomStack.getNamespacedIdsInRegistry()
- }
-
-}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt
deleted file mode 100644
index 11622f9..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/SuperEnchantDependency.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.plugins
-
-import com.maddoxh.superEnchants.SuperEnchants
-import com.maddoxh.superEnchants.enchants.EnchantManager
-import com.maddoxh.superEnchants.listeners.AnvilListener
-import io.delilaheve.CustomAnvil
-import org.bukkit.command.Command
-import org.bukkit.command.CommandExecutor
-import org.bukkit.command.CommandSender
-import org.bukkit.event.inventory.InventoryClickEvent
-import org.bukkit.plugin.RegisteredListener
-import xyz.alexcrea.cuanvil.api.EnchantmentApi
-import xyz.alexcrea.cuanvil.enchant.bulk.SuperEnchantBulkOperation
-import xyz.alexcrea.cuanvil.enchant.wrapped.CASuperEnchantEnchantment
-import java.util.logging.Level
-
-class SuperEnchantDependency(override val plugin: SuperEnchants): GenericPluginDependency(plugin, false) {
-
- lateinit var enchManager: EnchantManager
- val enchantments = ArrayList()
-
- fun registerEnchantments(): Boolean{
- CustomAnvil.instance.logger.info("Preparing Super Enchant compatibility...")
-
- val field = SuperEnchants::class.java.getDeclaredField("enchantManager")
- if(field == null) {
- CustomAnvil.instance.logger.log(Level.SEVERE, "Failed to initialize Super Enchant compatibility")
- return false
- }
- field.setAccessible(true)
-
- val bulkOpperations = SuperEnchantBulkOperation(plugin)
- EnchantmentApi.addBulkGet(bulkOpperations)
- EnchantmentApi.addBulkClean(bulkOpperations)
-
- enchManager = field.get(plugin) as EnchantManager
- overrideReloadCommand()
-
- reload()
- return true
- }
-
- fun reload() {
- for (enchantment in enchantments) {
- EnchantmentApi.unregisterEnchantment(enchantment)
- }
- enchantments.clear()
-
- // Register enchantments
- for (enchant in enchManager.getAll()) {
- val enchantment = CASuperEnchantEnchantment(enchant, plugin, enchManager)
- enchantments.add(enchantment)
-
- EnchantmentApi.registerEnchantment(enchantment)
- }
- }
-
- private fun overrideReloadCommand() {
- val reload = CustomAnvil.instance.getCommand("sereload")
-
- reload?.setExecutor(ReloadInterceptor(reload.executor))
- }
-
- inner class ReloadInterceptor(val other: CommandExecutor): CommandExecutor {
-
- override fun onCommand(
- sender: CommandSender,
- command: Command,
- label: String,
- args: Array
- ): Boolean {
- val result = other.onCommand(sender, command, label, args)
-
- CustomAnvil.log("Detected SuperEnchant reload")
- reload()
-
- return result
- }
-
- }
-
- override fun fillPostAnvil(postAnvil: ArrayList, preAnvil: ArrayList) {
-
- for (registeredListener in InventoryClickEvent.getHandlerList().registeredListeners) {
-
- if (registeredListener.listener.javaClass != AnvilListener::class.java) continue
- postAnvil.add(registeredListener)
- }
- }
-
-}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/AbstractMaterialGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/AbstractMaterialGroup.kt
index d0d2bda..ec6e7bc 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/AbstractMaterialGroup.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/AbstractMaterialGroup.kt
@@ -1,8 +1,7 @@
package xyz.alexcrea.cuanvil.group
import org.bukkit.Material
-import org.bukkit.NamespacedKey
-import xyz.alexcrea.cuanvil.util.MaterialUtil
+import java.util.*
abstract class AbstractMaterialGroup(private val name: String) {
protected val includedMaterial by lazy { createDefaultSet() }
@@ -10,12 +9,12 @@ abstract class AbstractMaterialGroup(private val name: String) {
/**
* Get the group default set
*/
- protected abstract fun createDefaultSet(): MutableSet
+ protected abstract fun createDefaultSet(): EnumSet
/**
* Get if a material is allowed following the group policy
*/
- open fun contain(mat: NamespacedKey): Boolean {
+ open fun contain(mat: Material): Boolean {
return mat in getMaterials()
}
@@ -28,13 +27,13 @@ abstract class AbstractMaterialGroup(private val name: String) {
* Push a material to this group to follow this group policy
* @return this instance.
*/
- abstract fun addToPolicy(type: NamespacedKey): AbstractMaterialGroup
+ abstract fun addToPolicy(mat: Material): AbstractMaterialGroup
/**
* Push a list of material to this group to follow this group policy
* @return this instance.
*/
- fun addAll(vararg materials: NamespacedKey): AbstractMaterialGroup {
+ fun addAll(vararg materials: Material): AbstractMaterialGroup {
for (material in materials) {
addToPolicy(material)
}
@@ -61,19 +60,19 @@ abstract class AbstractMaterialGroup(private val name: String) {
/**
* Get the group contained material as a set
*/
- abstract fun getMaterials(): Set
+ abstract fun getMaterials(): EnumSet
/**
* Get the group non-inherited material as a set
*/
- open fun getNonGroupInheritedMaterials(): Set {
+ open fun getNonGroupInheritedMaterials(): EnumSet {
return includedMaterial
}
/**
* Get the group non-inherited material as a set
*/
- open fun setNonGroupInheritedMaterials(materials: Set) {
+ open fun setNonGroupInheritedMaterials(materials: EnumSet) {
this.includedMaterial.clear()
this.includedMaterial.addAll(materials)
}
@@ -103,9 +102,8 @@ abstract class AbstractMaterialGroup(private val name: String) {
// Test inner material
val matIterator = includedMaterial.iterator()
while (matIterator.hasNext()) {
- val key = matIterator.next()
- val material = MaterialUtil.getMatFromKey(key)
- if (material == null || material.isAir) continue
+ val material = matIterator.next()
+ if (material.isAir) continue
return material
}
// Test included group representative material
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt
index 59841ac..56e923f 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt
@@ -2,18 +2,15 @@ package xyz.alexcrea.cuanvil.group
import io.delilaheve.CustomAnvil
import org.bukkit.Material
-import org.bukkit.NamespacedKey
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
class EnchantConflictGroup(
val name: String,
private val cantConflict: AbstractMaterialGroup,
- var minBeforeBlock: Int,
+ var minBeforeBlock: Int
) {
private val enchantments = HashSet()
- private val conflictsAfterLevel = HashMap()
- private val conflictsBeforeLevel = HashMap()
fun addEnchantment(enchant: CAEnchantment) {
enchantments.add(enchant)
@@ -22,56 +19,19 @@ class EnchantConflictGroup(
enchantments.addAll(enchants)
}
- private fun canBypassByBeforeLevel(enchants: Map): Boolean {
- // Either there no "conflict after"
- if(conflictsAfterLevel.isEmpty()) return false
-
- // Or we check if any conflict after enchantment is true
- for (entry in conflictsAfterLevel) {
- val current = enchants.getOrDefault(entry.key, 0)
- if(current > entry.value)
- return false
- }
-
- return true
- }
-
- private fun canBypassByAfterLevel(enchants: Map): Boolean {
- // Either there no "conflict after"
- if(conflictsBeforeLevel.isEmpty()) return false
-
- // Or we check if any conflict after enchantment is true
- for (entry in conflictsBeforeLevel) {
- val current = enchants.getOrDefault(entry.key, 0)
- if(current < entry.value)
- return false
- }
-
- return true
- }
-
- private fun canBypassConflictByLevel(enchants: Map): Boolean {
- return canBypassByBeforeLevel(enchants) || canBypassByAfterLevel(enchants)
- }
-
- fun allowed(enchants: Map, mat: NamespacedKey): Boolean {
+ fun allowed(enchants: Set, mat: Material): Boolean {
if (enchantments.size < minBeforeBlock) {
CustomAnvil.verboseLog("Conflicting bc of to many enchantments")
return true
}
- if (cantConflict.contain(mat))
- return true
-
- // If empty we skip. else we
- if(canBypassConflictByLevel(enchants))
+ if (cantConflict.contain(mat)) {
return true
+ }
// Count the amount of enchantment that are in the list
var enchantAmount = 0
- for (entry in enchants) {
- val enchantment = entry.key
-
+ for (enchantment in enchants) {
if (enchantment !in enchantments) continue
CustomAnvil.verboseLog("Enchant ${enchantment.key} is in: ${enchantAmount + 1}/$minBeforeBlock ")
if (++enchantAmount > minBeforeBlock) {
@@ -96,36 +56,6 @@ class EnchantConflictGroup(
enchantments.addAll(enchants)
}
- fun getConflictAfters(): HashMap {
- return conflictsAfterLevel
- }
-
- fun putConflictAfterLevel(enchantment: CAEnchantment, level: Int): Boolean {
- return null != (
- if(level < 0) conflictsAfterLevel.remove(enchantment)
- else conflictsAfterLevel.put(enchantment, level))
- }
-
- fun setConflictsAfterLevel(conflictAfterLevel: HashMap) {
- this.conflictsAfterLevel.clear()
- this.conflictsAfterLevel.putAll(conflictAfterLevel)
- }
-
- fun getConflictsBefore(): HashMap {
- return conflictsBeforeLevel
- }
-
- fun putConflictsBeforeLevel(enchantment: CAEnchantment, level: Int): Boolean {
- return null != (
- if(level < 0) conflictsBeforeLevel.remove(enchantment)
- else conflictsBeforeLevel.put(enchantment, level))
- }
-
- fun setConflictsBeforeLevel(conflictBeforeLevel: HashMap) {
- this.conflictsBeforeLevel.clear()
- this.conflictsBeforeLevel.putAll(conflictBeforeLevel)
- }
-
fun getRepresentativeMaterial(): Material {
val groups = getCantConflictGroup().getGroups()
val groupIterator = groups.iterator()
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt
index 38d5476..169d9e9 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt
@@ -8,9 +8,7 @@ import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry
-import xyz.alexcrea.cuanvil.util.MaterialUtil.customType
import java.util.*
-import kotlin.collections.set
class EnchantConflictManager {
@@ -18,14 +16,6 @@ class EnchantConflictManager {
// Path for the enchantments list
const val ENCH_LIST_PATH = "enchantments"
- // Path for list of enchantments conflicting before level
- //TODO add test and gui
- const val CONFLICT_AFTER_LEVEL_LIST_PATH = "conflict_after_level"
-
- // Path for list of enchantments conflicting before level
- //TODO add test and gui
- const val CONFLICT_BEFORE_LEVEL_LIST_PATH = "conflict_before_level"
-
// Path for group list related to the conflict
const val CONFLICT_GROUP_PATH = "notAffectedGroups"
@@ -49,11 +39,6 @@ class EnchantConflictManager {
lateinit var conflictList: ArrayList
-
- private fun warnBadKey(key: String) {
- CustomAnvil.instance.logger.warning("Invalid key $key for conflict: is not a conflict")
- }
-
// Read and prepare all conflict
fun prepareConflicts(config: ConfigurationSection, itemManager: ItemGroupManager) {
conflictList = ArrayList()
@@ -65,11 +50,7 @@ class EnchantConflictManager {
val keys = config.getKeys(false)
for (key in keys) {
- val section = config.getConfigurationSection(key)
- if(section == null) {
- warnBadKey(key)
- continue
- }
+ val section = config.getConfigurationSection(key)!!
val conflict = createConflict(section, itemManager, key)
addConflict(conflict)
@@ -129,36 +110,9 @@ class EnchantConflictManager {
}
}
- val conflictsAfterLevel = section.getConfigurationSection(CONFLICT_AFTER_LEVEL_LIST_PATH)
- val conflictsAfterMap = conflict.getConflictAfters()
- fetchConditionalRestriction(conflictsAfterMap, conflictsAfterLevel, conflictName)
-
- val conflictsBeforeLevel = section.getConfigurationSection(CONFLICT_BEFORE_LEVEL_LIST_PATH)
- val conflictsBeforeMap = conflict.getConflictsBefore()
- fetchConditionalRestriction(conflictsBeforeMap, conflictsBeforeLevel, conflictName)
-
return conflict
}
- private fun fetchConditionalRestriction(restrictions: MutableMap, section: ConfigurationSection?, conflictName: String) {
- if(section == null) return
- for (enchantName in section.getKeys(false)) {
- val enchants = getEnchantByIdentifier(enchantName)
- if (enchants.isEmpty()) {
- CustomAnvil.instance.logger.warning("Enchantment $enchantName do not exist but was asked for conditional restriction for conflict $conflictName")
- continue
- }
-
- val value = section.getInt(enchantName, -1)
- if(value < 0) continue
-
- for (enchant in enchants) {
- val previous = restrictions.getOrDefault(enchant, value)
- restrictions[enchant] = value.coerceAtMost(previous)
- }
- }
- }
-
private fun getEnchantByIdentifier(enchantName: String): List {
val key = NamespacedKey.fromString(enchantName)
if (key != null) {
@@ -221,8 +175,8 @@ class EnchantConflictManager {
item: ItemStack,
newEnchant: CAEnchantment
): ConflictType {
- val type = item.customType
- CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${type}")
+ val mat = item.type
+ CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.key}")
val conflictList = newEnchant.conflicts
var result = ConflictType.NO_CONFLICT
@@ -233,7 +187,7 @@ class EnchantConflictManager {
continue
}
- val allowed = conflict.allowed(appliedEnchants, type)
+ val allowed = conflict.allowed(appliedEnchants.keys, mat)
CustomAnvil.verboseLog("Was against $conflict and conflicting: ${!allowed} ")
if (!allowed) {
if (conflict.getEnchants().size <= 1) {
@@ -249,7 +203,7 @@ class EnchantConflictManager {
val immutableEnchants = Collections.unmodifiableMap(appliedEnchants)
for (appliedEnchant in appliedEnchants.keys) {
if (appliedEnchant is AdditionalTestEnchantment) {
- val doConflict = appliedEnchant.isEnchantConflict(immutableEnchants, type)
+ val doConflict = appliedEnchant.isEnchantConflict(immutableEnchants, mat)
if (doConflict) {
CustomAnvil.verboseLog("Big conflict by additional test, stopping")
return ConflictType.ENCHANTMENT_CONFLICT
@@ -261,7 +215,7 @@ class EnchantConflictManager {
if ((result != ConflictType.ITEM_CONFLICT) && (newEnchant is AdditionalTestEnchantment)) {
val partialItem = createPartialResult(item, immutableEnchants)
- if (newEnchant.isItemConflict(immutableEnchants, type, partialItem)) {
+ if (newEnchant.isItemConflict(immutableEnchants, mat, partialItem)) {
return ConflictType.ITEM_CONFLICT
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/ExcludeGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/ExcludeGroup.kt
index d752db5..7684c3f 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/ExcludeGroup.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/ExcludeGroup.kt
@@ -1,12 +1,11 @@
package xyz.alexcrea.cuanvil.group
-import org.bukkit.NamespacedKey
+import org.bukkit.Material
import java.util.*
class ExcludeGroup(name: String) : AbstractMaterialGroup(name) {
-
- override fun createDefaultSet(): MutableSet {
- return NegativeMaterialSet()
+ override fun createDefaultSet(): EnumSet {
+ return EnumSet.allOf(Material::class.java)
}
private var includedGroup: MutableSet = HashSet()
@@ -21,9 +20,9 @@ class ExcludeGroup(name: String) : AbstractMaterialGroup(name) {
return false
}
- override fun addToPolicy(type: NamespacedKey): ExcludeGroup {
- includedMaterial.remove(type)
- groupItems.remove(type)
+ override fun addToPolicy(mat: Material): ExcludeGroup {
+ includedMaterial.remove(mat)
+ groupItems.remove(mat)
return this
}
@@ -61,7 +60,7 @@ class ExcludeGroup(name: String) : AbstractMaterialGroup(name) {
}
}
- override fun getMaterials(): MutableSet {
+ override fun getMaterials(): EnumSet {
return groupItems
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/IncludeGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/IncludeGroup.kt
index fc9614b..848789f 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/IncludeGroup.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/IncludeGroup.kt
@@ -1,12 +1,11 @@
package xyz.alexcrea.cuanvil.group
import org.bukkit.Material
-import org.bukkit.NamespacedKey
import java.util.*
class IncludeGroup(name: String) : AbstractMaterialGroup(name) {
- override fun createDefaultSet(): MutableSet {
- return HashSet()
+ override fun createDefaultSet(): EnumSet {
+ return EnumSet.noneOf(Material::class.java)
}
private var includedGroup: MutableSet = HashSet()
@@ -21,9 +20,9 @@ class IncludeGroup(name: String) : AbstractMaterialGroup(name) {
return false
}
- override fun addToPolicy(type: NamespacedKey): IncludeGroup {
- includedMaterial.add(type)
- groupItems.add(type)
+ override fun addToPolicy(mat: Material): IncludeGroup {
+ includedMaterial.add(mat)
+ groupItems.add(mat)
return this
}
@@ -48,7 +47,7 @@ class IncludeGroup(name: String) : AbstractMaterialGroup(name) {
}
}
- override fun setNonGroupInheritedMaterials(materials: Set) {
+ override fun setNonGroupInheritedMaterials(materials: EnumSet) {
super.setNonGroupInheritedMaterials(materials)
updateMaterials()
@@ -67,7 +66,7 @@ class IncludeGroup(name: String) : AbstractMaterialGroup(name) {
}
}
- override fun getMaterials(): MutableSet {
+ override fun getMaterials(): EnumSet {
return groupItems
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/ItemGroupManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/ItemGroupManager.kt
index 348d0ff..65eef34 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/ItemGroupManager.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/ItemGroupManager.kt
@@ -31,8 +31,6 @@ class ItemGroupManager {
for (key in keys) {
if (groupMap.containsKey(key))
continue
- if (!config.isConfigurationSection(key))
- continue
createGroup(config, keys, key)
}
}
@@ -53,7 +51,6 @@ class ItemGroupManager {
key: String
): AbstractMaterialGroup {
val groupSection = config.getConfigurationSection(key)!!
-
val groupType = groupSection.getString(GROUP_TYPE_PATH, null)
// Create Material group according to the group type
@@ -94,7 +91,7 @@ class ItemGroupManager {
}
continue
}
- group.addToPolicy(material.key)
+ group.addToPolicy(material)
}
// Read group to include in this group policy.
@@ -108,13 +105,11 @@ class ItemGroupManager {
continue
}
// Get other group or create it if not yet created
- val otherGroup =
- if (!groupMap.containsKey(groupName)) {
- if(!config.isConfigurationSection(groupName)) continue
+ val otherGroup = if (!groupMap.containsKey(groupName)) {
createGroup(config, keys, groupName)
+ } else {
+ groupMap[groupName]!!
}
- else groupMap[groupName]!!
-
// Avoid self reference or it will create an infinite loop
if (otherGroup.isReferencing(group)) {
CustomAnvil.instance.logger.warning(
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/NegativeMaterialSet.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/NegativeMaterialSet.kt
deleted file mode 100644
index d87004d..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/NegativeMaterialSet.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package xyz.alexcrea.cuanvil.group
-
-import org.bukkit.NamespacedKey
-import xyz.alexcrea.cuanvil.util.MaterialUtil
-import xyz.alexcrea.cuanvil.util.NegativeSet
-
-class NegativeMaterialSet: NegativeSet() {
-
- override fun iterator(): MutableIterator {
- val materials = MaterialUtil.getMaterials()
- materials.removeIf { negate.contains(it) }
-
- return materials.iterator()
- }
-
- override fun isEmpty(): Boolean {
- return negate.size >= MaterialUtil.getMaterialCount()
- }
-
- override val size get() = MaterialUtil.getMaterialCount() - negate.size
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilCloseListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilCloseListener.kt
index d707b56..60a0339 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilCloseListener.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilCloseListener.kt
@@ -7,7 +7,6 @@ import org.bukkit.event.Listener
import org.bukkit.event.inventory.InventoryCloseEvent
import org.bukkit.inventory.AnvilInventory
import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
-import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
class AnvilCloseListener(private val packetManager: PacketManager) : Listener {
@@ -19,7 +18,6 @@ class AnvilCloseListener(private val packetManager: PacketManager) : Listener {
packetManager.setInstantBuild(player, false)
}
- AnvilRenameDialogUtil.anvilRenameDialog.closeInventory(player)
}
}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt
index e393dbd..bc3afa4 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt
@@ -3,6 +3,7 @@ package xyz.alexcrea.cuanvil.listener
import io.delilaheve.CustomAnvil
import io.delilaheve.util.ConfigOptions
import io.delilaheve.util.ItemUtil.canMergeWith
+import io.delilaheve.util.ItemUtil.unitRepair
import org.bukkit.GameMode
import org.bukkit.Material
import org.bukkit.entity.Player
@@ -15,25 +16,22 @@ import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BookMeta
-import xyz.alexcrea.cuanvil.anvil.AnvilCost
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.AnvilResult
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.CustomCraftResult
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.LoreEditResult
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.UnitRepairResult
import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentDisplayName
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_LEFT
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_RIGHT
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT
+import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe
+import xyz.alexcrea.cuanvil.util.AnvilLoreEditUtil
+import xyz.alexcrea.cuanvil.util.AnvilUseType
+import xyz.alexcrea.cuanvil.util.AnvilXpUtil
import xyz.alexcrea.cuanvil.util.CustomRecipeUtil
import xyz.alexcrea.cuanvil.util.MiniMessageUtil
-import xyz.alexcrea.cuanvil.util.anvil.AnvilLoreEditUtil
-import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
+import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil
import xyz.alexcrea.cuanvil.util.config.LoreEditType
import java.util.*
+import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicReference
import kotlin.math.min
@@ -52,7 +50,6 @@ class AnvilResultListener : Listener {
fun anvilExtractionCheck(event: InventoryClickEvent) {
val player = event.whoClicked as? Player ?: return
val inventory = event.inventory as? AnvilInventory ?: return
- val view = event.view
if (event.rawSlot != ANVIL_OUTPUT_SLOT) {
return
@@ -67,104 +64,84 @@ class AnvilResultListener : Listener {
val leftItem = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
val rightItem = inventory.getItem(ANVIL_INPUT_RIGHT)
- // Deny by default. allow if working
- event.result = Event.Result.DENY
if (GameMode.CREATIVE != player.gameMode && inventory.repairCost >= inventory.maximumRepairCost) {
+ event.result = Event.Result.DENY
return
}
// Test custom recipe
- val customRecipeResult = AnvilMergeLogic.testCustomRecipe(view, inventory, player, leftItem, rightItem)
- if (!customRecipeResult.isEmpty()) {
+ val recipe = CustomRecipeUtil.getCustomRecipe(leftItem, rightItem)
+ if (recipe != null) {
+ event.result = Event.Result.ALLOW
onCustomCraft(
- event, player, inventory,
- leftItem, rightItem, customRecipeResult
+ event, recipe, player,
+ leftItem, rightItem, output, inventory
)
return
}
// Do not continue if there was no change
if ((output == inventory.getItem(ANVIL_INPUT_LEFT))) {
+ event.result = Event.Result.DENY
return
}
// Rename
if (rightItem == null) {
- val result = AnvilMergeLogic.doRenaming(view, inventory, player, leftItem)
- if (result.isEmpty()) return
-
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- null, 0,
- result
- )
+ event.result = Event.Result.ALLOW
return
}
// Merge
val canMerge = leftItem.canMergeWith(rightItem)
if (canMerge) {
- val result = AnvilMergeLogic.doMerge(view, inventory, player, leftItem, rightItem)
-
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- null, 0,
- result
- )
+ event.result = Event.Result.ALLOW
return
}
// Unit repair
- val unitRepairResult = AnvilMergeLogic.testUnitRepair(
- view, inventory, player,
- leftItem, rightItem
- )
- if (!unitRepairResult.isEmpty()) {
+ val unitRepairResult = leftItem.getRepair(rightItem)
+ if (unitRepairResult != null) {
onUnitRepairExtract(
- rightItem, event, player, inventory,
- unitRepairResult
+ leftItem, rightItem, output,
+ unitRepairResult, event, player, inventory
)
return
}
// For lore edit
- val loreResult = AnvilMergeLogic.testLoreEdit(player, leftItem, rightItem)
- if (!loreResult.isEmpty()) {
- if (loreResult.type.isBook)
- handleBookLoreEdit(event, inventory, player, leftItem, rightItem, loreResult)
- else
- handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, loreResult)
+ if (handleBookLoreEdit(event, inventory, player, leftItem, rightItem, output)) {
+ return
+ } else if (handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, output)) {
return
}
+
+ // Else there was no working situation somehow so we deny
+ event.result = Event.Result.DENY
}
private fun onCustomCraft(
event: InventoryClickEvent,
+ recipe: AnvilCustomRecipe,
player: Player,
- inventory: AnvilInventory,
leftItem: ItemStack,
rightItem: ItemStack?,
- result: CustomCraftResult,
+ output: ItemStack,
+ inventory: AnvilInventory
) {
- val recipe = result.recipe!!
- val rawCost = result.customCraftCost.rawCost
+ event.result = Event.Result.DENY
+
+ if (recipe.leftItem == null) return // in case it changed
+
+ val amount = CustomRecipeUtil.getCustomRecipeAmount(recipe, leftItem, rightItem)
+ val xpCost = recipe.determineCost(amount, leftItem, output)
val finalCost =
- if (recipe.removeExactLinearXp) rawCost
- else AnvilXpUtil.calculateLevelForXp(rawCost)
-
- CustomAnvil.log(
- "gamemode: ${player.gameMode != GameMode.CREATIVE}, " +
- "cost: $finalCost, level: ${player.level}, " +
- "result: ${player.totalExperience < finalCost} ${player.level < finalCost}"
- )
+ if (recipe.removeExactLinearXp) xpCost
+ else AnvilXpUtil.calculateLevelForXp(xpCost)
+ CustomAnvil.log("gamemode: ${player.gameMode != GameMode.CREATIVE}, cost: $finalCost, level: ${player.level}, result: ${player.totalExperience < finalCost} ${player.level < finalCost}")
if (player.gameMode != GameMode.CREATIVE) {
- if (ConfigOptions.shouldUseMoney(player)) {
- result.cost.isMonetary = true
- if (!EconomyManager.economy!!.has(player, result.cost.asMonetaryCost())) return
- } else if (recipe.removeExactLinearXp) {
+ if (recipe.removeExactLinearXp) {
val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
val totalXp = levelXp + player.exp * delta
@@ -181,31 +158,31 @@ class AnvilResultListener : Listener {
if (event.click != ClickType.MIDDLE &&
!handleCustomCraftClick(
event,
+ recipe,
inventory,
player,
leftItem,
rightItem,
- result
+ amount,
+ finalCost,
+ recipe.removeExactLinearXp
)
) return
// Finally, we add the item to the player
if (slotDestination.type == SlotType.CURSOR) {
- player.setItemOnCursor(result.item)
+ player.setItemOnCursor(output)
} else {// We assume SlotType == SlotType.INVENTORY
- player.inventory.setItem(slotDestination.slot, result.item)
+ player.inventory.setItem(slotDestination.slot, output)
}
}
private fun handleCustomCraftClick(
- event: InventoryClickEvent,
+ event: InventoryClickEvent, recipe: AnvilCustomRecipe,
inventory: AnvilInventory, player: Player,
leftItem: ItemStack, rightItem: ItemStack?,
- result: CustomCraftResult
+ amount: Int, xpCost: Int, linearCost: Boolean = false
): Boolean {
- val amount = result.amount
- val recipe = result.recipe!!
-
// We remove what should be removed
if (rightItem != null) {
if (recipe.rightItem == null) return false// in case it changed
@@ -217,7 +194,25 @@ class AnvilResultListener : Listener {
leftItem.amount -= amount * recipe.leftItem!!.amount
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
- removeCustomCraftCost(player, result)
+ if (player.gameMode != GameMode.CREATIVE) {
+ if (linearCost) {
+ val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
+ val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
+ var totalXp = levelXp + player.exp * delta
+ totalXp -= xpCost
+
+ val newLevel = AnvilXpUtil.calculateLevelForXp(totalXp.toInt())
+
+ val newLevelXp = AnvilXpUtil.calculateXpForLevel(newLevel)
+ val newDelta = AnvilXpUtil.calculateXpForLevel(newLevel + 1) - newLevelXp
+ val xp = (totalXp - newLevelXp) / newDelta
+
+ player.level = newLevel
+ player.exp = xp / newDelta
+ } else {
+ player.level -= xpCost
+ }
+ }
// Then we try to find the new values for the anvil
val newAmount = CustomRecipeUtil.getCustomRecipeAmount(recipe, leftItem, rightItem)
@@ -241,53 +236,6 @@ class AnvilResultListener : Listener {
return true
}
- private fun removeCustomCraftCost(player: Player, result: CustomCraftResult) {
- if (player.gameMode == GameMode.CREATIVE) return
-
- val rawCost = result.customCraftCost.rawCost
- if (result.cost.isMonetary) {
- EconomyManager.economy!!.remove(player, result.cost.asMonetaryCost())
- return
- }
-
- if (result.recipe!!.removeExactLinearXp) {
- val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
- val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
- var totalXp = levelXp + player.exp * delta
- totalXp -= rawCost
-
- val newLevel = AnvilXpUtil.calculateLevelForXp(totalXp.toInt())
-
- val newLevelXp = AnvilXpUtil.calculateXpForLevel(newLevel)
- val newDelta = AnvilXpUtil.calculateXpForLevel(newLevel + 1) - newLevelXp
- val xp = (totalXp - newLevelXp) / newDelta
-
- player.level = newLevel
- player.exp = xp / newDelta
- } else {
- player.level -= AnvilXpUtil.calculateLevelForXp(rawCost)
- }
-
- }
-
- private fun tryRemoveCost(player: Player, result: AnvilResult): Boolean {
- if (player.gameMode == GameMode.CREATIVE) return true
-
- val cost = result.cost
- if (cost.isMonetary) {
- val result = EconomyManager.economy!!.remove(player, cost.asMonetaryCost())
- if (!result) return false
- } else {
- val xpCost = cost.filteredXpCost()
- if (xpCost > AnvilXpUtil.maximumXpCost(result.ignoreXpRules)) return false
- if (player.level < xpCost) return false
-
- player.level -= xpCost
- }
-
- return true
- }
-
private fun extractAnvilResult(
event: InventoryClickEvent,
player: Player,
@@ -296,17 +244,15 @@ class AnvilResultListener : Listener {
leftRemoveCount: Int,
rightItem: ItemStack?,
rightRemoveCount: Int,
- result: AnvilResult
+ output: ItemStack,
+ repairCost: Int,
): Boolean {
- if (result.isEmpty()) return false
-
// To avoid vanilla, we cancel the event
event.result = Event.Result.DENY
event.isCancelled = true
- val cost = result.cost
- processCost(inventory, player, cost)
- if (!cost.valid && player.gameMode != GameMode.CREATIVE) return false
+ // Assumed if player do not have enough xp then it returned MIN_VALUE
+ if (repairCost == Int.MIN_VALUE) return false
// Where should we get the item
val slotDestination = getActionSlot(event, player)
@@ -314,8 +260,6 @@ class AnvilResultListener : Listener {
// If not creative middle click...
if (event.click != ClickType.MIDDLE) {
- if (!tryRemoveCost(player, result)) return false
-
// We remove what should be removed
if (leftItem != null) leftItem.amount -= leftRemoveCount
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
@@ -324,58 +268,99 @@ class AnvilResultListener : Listener {
inventory.setItem(ANVIL_INPUT_RIGHT, rightItem)
inventory.setItem(ANVIL_OUTPUT_SLOT, null)
-
+ player.level -= repairCost
}
// Finally, we add the item to the player
if (SlotType.CURSOR == slotDestination.type) {
- player.setItemOnCursor(result.item)
+ player.setItemOnCursor(output)
} else {// We assume SlotType == SlotType.INVENTORY
- player.inventory.setItem(slotDestination.slot, result.item)
+ player.inventory.setItem(slotDestination.slot, output)
}
// TODO probably anvil damage & sound here ??
return true
}
- private fun processCost(inventory: AnvilInventory, player: Player, cost: AnvilCost) {
- var sum = cost.repair
+ private fun onUnitRepairExtract(
+ leftItem: ItemStack,
+ rightItem: ItemStack,
+ output: ItemStack,
+ unitRepairResult: Double,
+ event: InventoryClickEvent,
+ player: Player,
+ inventory: AnvilInventory
+ ) {
+ val resultCopy = leftItem.clone()
+ val resultAmount = resultCopy.unitRepair(
+ rightItem.amount, unitRepairResult
+ )
+
+ // Get repair cost
+ val repairCost = getUnitRepairCost(inventory, player, leftItem, output, resultCopy, resultAmount)
+
+ // And then we give the item manually
+ extractAnvilResult(
+ event, player, inventory,
+ null, 0,
+ rightItem, resultAmount,
+ resultCopy, repairCost
+ )
+ }
+
+ private fun getUnitRepairCost(
+ inventory: AnvilInventory, player: Player,
+ leftItem: ItemStack, output: ItemStack,
+ resultCopy: ItemStack, resultAmount: Int
+ ): Int {
+ if (player.gameMode == GameMode.CREATIVE) return 0
+
+ var repairCost = 0
+ // Get repairCost
+ leftItem.itemMeta?.let { leftMeta ->
+ val leftName = leftMeta.displayName
+ output.itemMeta?.let {
+ // Rename cost
+ if (!leftName.contentEquals(it.displayName)) {
+ repairCost += ConfigOptions.itemRenameCost
+
+ // Color cost
+ if (it.displayName.contains('§')) {
+ repairCost += ConfigOptions.useOfColorCost
+ }
+ }
+ }
+ }
+
+ repairCost += AnvilXpUtil.calculatePenalty(leftItem, null, resultCopy, AnvilUseType.UNIT_REPAIR)
+ repairCost += resultAmount * ConfigOptions.unitRepairCost
if (
!ConfigOptions.doRemoveCostLimit &&
ConfigOptions.doCapCost
) {
- val final = min(sum, ConfigOptions.maxAnvilCost)
- cost.generic += (final - sum)
-
- sum = final
+ repairCost = min(repairCost, ConfigOptions.maxAnvilCost)
}
- if (ConfigOptions.shouldUseMoney(player)) {
- cost.isMonetary = true
- if (!EconomyManager.economy!!.has(player, cost.asMonetaryCost()))
- cost.valid = false
- } else {
- if ((inventory.maximumRepairCost <= sum)
- || (player.level < sum)
- ) cost.valid = false
- }
+ if ((inventory.maximumRepairCost <= repairCost)
+ || (player.level < repairCost)
+ ) return Int.MIN_VALUE
+
+ return repairCost
}
- private fun onUnitRepairExtract(
- rightItem: ItemStack,
- event: InventoryClickEvent,
+ private fun getFromLoreEditXpCost(
+ xpCost: AtomicInteger,
player: Player,
inventory: AnvilInventory,
- result: UnitRepairResult,
- ) {
- // We give the item manually
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- rightItem, result.repairAmount,
- result
- )
+ ): Int {
+ if (GameMode.CREATIVE == player.gameMode) return 0
+
+ val repairCost = xpCost.get()
+ return if ((inventory.maximumRepairCost <= repairCost)
+ || (player.level < repairCost)
+ ) Int.MIN_VALUE
+ else repairCost
}
private fun handleBookLoreEdit(
@@ -384,84 +369,70 @@ class AnvilResultListener : Listener {
player: Player,
leftItem: ItemStack,
rightItem: ItemStack,
- result: LoreEditResult
- ) {
- if (result.type.isAppend)
- handleBookLoreAppend(event, inventory, player, rightItem, result)
- else
- handleBookLoreRemove(event, inventory, player, leftItem, rightItem, result)
- }
+ output: ItemStack,
+ ): Boolean {
+ if (Material.WRITABLE_BOOK != rightItem.type) return false
+ val bookMeta = rightItem.itemMeta as BookMeta? ?: return false
- private fun handleBookLoreAppend(
- event: InventoryClickEvent,
- inventory: AnvilInventory,
- player: Player,
- rightItem: ItemStack,
- result: LoreEditResult
- ) {
- val bookMeta = rightItem.itemMeta as BookMeta? ?: return
+ val editType = AnvilLoreEditUtil.bookLoreEditIsAppend(leftItem, rightItem) ?: return false
- // Remove pages to book
- val clearedBook: ItemStack?
- if (LoreEditType.APPEND_BOOK.doConsume) {
- clearedBook = null
- } else {
- clearedBook = rightItem.clone()
- bookMeta.pages = Collections.emptyList()
- clearedBook.itemMeta = bookMeta
- }
+ val xpCost = AtomicInteger()
+ if (editType) {
+ if (output != AnvilLoreEditUtil.handleLoreAppendByBook(player, leftItem, bookMeta, xpCost)) return false
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- clearedBook, 0,
- result
- )
- }
-
- private fun handleBookLoreRemove(
- event: InventoryClickEvent,
- inventory: AnvilInventory,
- player: Player,
- leftItem: ItemStack,
- rightItem: ItemStack,
- result: LoreEditResult
- ) {
- val bookMeta = rightItem.itemMeta as BookMeta? ?: return
-
- // fill book meta
- val lore = DependencyManager.stripLore(leftItem)
- if (lore.isEmpty()) return
-
- val rightCopy: ItemStack?
- if (LoreEditType.REMOVE_BOOK.doConsume) {
- rightCopy = null
- } else {
- // Uncolor the page
- AnvilLoreEditUtil.uncolorLines(player, lore, LoreEditType.REMOVE_BOOK)
-
- val bookPage = StringBuilder()
- lore.forEach {
- if (bookPage.isNotEmpty()) bookPage.append('\n')
- if (it == null) return@forEach
-
- bookPage.append(MiniMessageUtil.plain_text_mm.serialize(it))
+ // Remove pages to book
+ val clearedBook: ItemStack?
+ if (LoreEditType.APPEND_BOOK.doConsume) {
+ clearedBook = null
+ } else {
+ clearedBook = rightItem.clone()
+ bookMeta.pages = Collections.emptyList()
+ clearedBook.itemMeta = bookMeta
}
- val resultPage = bookPage.toString()
- //TODO maybe check page size ? bc it may be too big ???
+ return extractAnvilResult(
+ event, player, inventory,
+ null, 0,
+ clearedBook, 0,
+ output, getFromLoreEditXpCost(xpCost, player, inventory)
+ )
+ } else {
+ if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, xpCost)) return false
- rightCopy = rightItem.clone()
- bookMeta.setPages(resultPage)
- rightCopy.itemMeta = bookMeta
+ // fill book meta
+ val lore = DependencyManager.stripLore(leftItem)
+ if (lore.isEmpty()) return false
+
+ val rightCopy: ItemStack?
+ if (LoreEditType.REMOVE_BOOK.doConsume) {
+ rightCopy = null
+ } else {
+ // Uncolor the page
+ AnvilLoreEditUtil.uncolorLines(player, lore, LoreEditType.REMOVE_BOOK)
+
+ val bookPage = StringBuilder()
+ lore.forEach {
+ if (bookPage.isNotEmpty()) bookPage.append('\n')
+ if(it == null) return@forEach
+
+ bookPage.append(MiniMessageUtil.plain_text_mm.serialize(it))
+ }
+
+ val resultPage = bookPage.toString()
+ //TODO maybe check page size ? bc it may be too big ???
+
+ rightCopy = rightItem.clone()
+ bookMeta.setPages(resultPage)
+ rightCopy.itemMeta = bookMeta
+ }
+
+ return extractAnvilResult(
+ event, player, inventory,
+ null, 0,
+ rightCopy, 0,
+ output, getFromLoreEditXpCost(xpCost, player, inventory)
+ )
}
-
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- rightCopy, 0,
- result
- )
}
private fun handlePaperLoreEdit(
@@ -470,106 +441,89 @@ class AnvilResultListener : Listener {
player: Player,
leftItem: ItemStack,
rightItem: ItemStack,
- result: LoreEditResult
- ) {
- if (result.type.isAppend)
- handlePaperLoreAppend(event, inventory, player, rightItem, result)
- else
- handlePaperLoreRemove(event, inventory, player, leftItem, rightItem, result)
- }
+ output: ItemStack,
+ ): Boolean {
+ if (Material.PAPER != rightItem.type) return false
+ val paperMeta = rightItem.itemMeta ?: return false
- private fun handlePaperLoreAppend(
- event: InventoryClickEvent,
- inventory: AnvilInventory,
- player: Player,
- rightItem: ItemStack,
- result: LoreEditResult
- ) {
- val paperMeta = rightItem.itemMeta ?: return
+ val editTypeIsAppend = AnvilLoreEditUtil.paperLoreEditIsAppend(leftItem, rightItem) ?: return false
+ val xpCost = AtomicInteger()
+ if (editTypeIsAppend) {
+ if (output != AnvilLoreEditUtil.handleLoreAppendByPaper(player, leftItem, rightItem, xpCost)) return false
- val paperCopy: ItemStack?
- if (LoreEditType.APPEND_PAPER.doConsume) {
- paperCopy = null
+ val paperCopy: ItemStack?
+ if (LoreEditType.APPEND_PAPER.doConsume) {
+ paperCopy = null
+ } else {
+ // Remove custom name to paper
+ paperCopy = rightItem.clone()
+ paperCopy.amount = 1
+ paperMeta.setComponentDisplayName(null)
+ paperCopy.itemMeta = paperMeta
+ }
+
+ return if (rightItem.amount > 1) {
+ extractAnvilResult(
+ event, player, inventory,
+ paperCopy, 0,
+ rightItem, 1,
+ output, getFromLoreEditXpCost(xpCost, player, inventory)
+ )
+ } else {
+ extractAnvilResult(
+ event, player, inventory,
+ null, 0,
+ paperCopy, 0,
+ output, getFromLoreEditXpCost(xpCost, player, inventory)
+ )
+ }
} else {
- // Remove custom name to paper
- paperCopy = rightItem.clone()
- paperCopy.amount = 1
- paperMeta.setComponentDisplayName(null)
+ if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem, xpCost)) return false
- // Remove pcd name
- AnvilMergeLogic.processPCD(paperMeta, player, null)
+ val leftMeta = leftItem.itemMeta
+ if (leftMeta == null || !leftMeta.hasLore()) return false
+ val lore = DependencyManager.stripLore(leftItem)
+ if (lore.isEmpty()) return false
- paperCopy.itemMeta = paperMeta
+ // Create result item
+ val rightClone: ItemStack?
+ if (LoreEditType.REMOVE_PAPER.doConsume) {
+ rightClone = null
+ } else {
+ val removeEnd = LoreEditConfigUtil.paperLoreOrderIsEnd
+ val line = if (removeEnd) lore[lore.size - 1]
+ else lore[0]
+
+ // uncolor the line
+ val ref = AtomicReference(line)
+ AnvilLoreEditUtil.uncolorLine(player, ref, LoreEditType.REMOVE_PAPER)
+
+ rightClone = rightItem.clone()
+ rightClone.amount = 1
+
+ val resultMeta = rightClone.itemMeta ?: return false
+ resultMeta.setComponentDisplayName(ref.get())
+ rightClone.itemMeta = resultMeta
+ }
+
+ return if (rightItem.amount > 1) {
+ extractAnvilResult(
+ event, player, inventory,
+ rightClone, 0,
+ rightItem, 1,
+ output, getFromLoreEditXpCost(xpCost, player, inventory)
+ )
+ } else {
+ extractAnvilResult(
+ event, player, inventory,
+ null, 0,
+ rightClone, 0,
+ output, getFromLoreEditXpCost(xpCost, player, inventory)
+ )
+ }
}
- if (rightItem.amount > 1) {
- extractAnvilResult(
- event, player, inventory,
- paperCopy, 0,
- rightItem, 1,
- result
- )
- } else {
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- paperCopy, 0,
- result
- )
- }
- }
-
- private fun handlePaperLoreRemove(
- event: InventoryClickEvent,
- inventory: AnvilInventory,
- player: Player,
- leftItem: ItemStack,
- rightItem: ItemStack,
- result: LoreEditResult
- ) {
- val leftMeta = leftItem.itemMeta
- if (leftMeta == null || !leftMeta.hasLore()) return
-
- val lore = DependencyManager.stripLore(leftItem)
- if (lore.isEmpty()) return
-
- // Create result item
- val rightClone: ItemStack?
- if (LoreEditType.REMOVE_PAPER.doConsume) {
- rightClone = null
- } else {
- val removeEnd = LoreEditConfigUtil.paperLoreOrderIsEnd
- val line = if (removeEnd) lore[lore.size - 1]
- else lore[0]
-
- // uncolor the line
- val ref = AtomicReference(line)
- AnvilLoreEditUtil.uncolorLine(player, ref, LoreEditType.REMOVE_PAPER)
-
- rightClone = rightItem.clone()
- rightClone.amount = 1
-
- val resultMeta = rightClone.itemMeta ?: return
- resultMeta.setComponentDisplayName(ref.get())
- rightClone.itemMeta = resultMeta
- }
-
- if (rightItem.amount > 1) {
- extractAnvilResult(
- event, player, inventory,
- rightClone, 0,
- rightItem, 1,
- result
- )
- } else {
- extractAnvilResult(
- event, player, inventory,
- null, 0,
- rightClone, 0,
- result
- )
- }
}
/**
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt
index 0217983..c47d828 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt
@@ -3,29 +3,29 @@ package xyz.alexcrea.cuanvil.listener
import com.github.stefvanschie.inventoryframework.util.InventoryViewUtil
import io.delilaheve.CustomAnvil
import io.delilaheve.util.ConfigOptions
+import io.delilaheve.util.EnchantmentUtil.combineWith
import io.delilaheve.util.ItemUtil.canMergeWith
+import io.delilaheve.util.ItemUtil.findEnchantments
+import io.delilaheve.util.ItemUtil.isEnchantedBook
+import io.delilaheve.util.ItemUtil.repairFrom
+import io.delilaheve.util.ItemUtil.setEnchantmentsUnsafe
+import io.delilaheve.util.ItemUtil.unitRepair
+import org.bukkit.ChatColor
+import org.bukkit.Material
import org.bukkit.entity.HumanEntity
-import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory
-import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.EnchantmentStorageMeta
import org.bukkit.inventory.meta.ItemMeta
-import xyz.alexcrea.cuanvil.anvil.AnvilCost
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.AnvilResult
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.doMerge
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.doRenaming
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testCustomRecipe
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testLoreEdit
-import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testUnitRepair
import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir
-import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
-import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
+import xyz.alexcrea.cuanvil.enchant.CAEnchantment
+import xyz.alexcrea.cuanvil.util.*
+import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair
+import java.util.concurrent.atomic.AtomicInteger
/**
* Listener for anvil events
@@ -38,8 +38,6 @@ class PrepareAnvilListener : Listener {
const val ANVIL_INPUT_LEFT = 0
const val ANVIL_INPUT_RIGHT = 1
const val ANVIL_OUTPUT_SLOT = 2
-
- var IS_EMPTY_TEST = false
}
/**
@@ -47,105 +45,66 @@ class PrepareAnvilListener : Listener {
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
fun anvilCombineCheck(event: PrepareAnvilEvent) {
- val view = event.view
+ // Should find player
+ val player: HumanEntity = InventoryViewUtil.getInstance().getPlayer(event.view)
val inventory = event.inventory
- val player = InventoryViewUtil.getInstance().getPlayer(view)
- if(player !is Player) return
-
- tryRenameDialog(player, event)
-
// Test if custom anvil is bypassed before immutability test
if (DependencyManager.earlyTryEventPreAnvilBypass(event, player)) {
// even if we got bypassed we still want to set price
- AnvilXpUtil.setAnvilInvCost(inventory, view, player, AnvilCost(event.inventory.repairCost))
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, event.inventory.repairCost)
return
}
- val first = inventory.getItem(ANVIL_INPUT_LEFT)
+ val first = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
val second = inventory.getItem(ANVIL_INPUT_RIGHT)
- if(IS_EMPTY_TEST) {
- IS_EMPTY_TEST = false
- applyResult(event, player, AnvilResult.EMPTY)
- return
- }
-
- if (ConfigOptions.verboseDebugLog) {
- CustomAnvil.verboseLog("Testing items:")
- CustomAnvil.verboseLog("first: $first")
- CustomAnvil.verboseLog("second: $second")
- }
if (isImmutable(first) || isImmutable(second)) {
CustomAnvil.verboseLog("Skipping anvil process as one of the two item is immutable")
- applyResult(event, player, AnvilResult.EMPTY)
+ event.result = null
return
}
// Test if the event should bypass custom anvil.
if (DependencyManager.tryEventPreAnvilBypass(event, player)) {
// even if we got bypassed we still want to set price
- AnvilXpUtil.setAnvilInvCost(inventory, view, player, AnvilCost(event.inventory.repairCost))
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, event.inventory.repairCost)
return
}
if (!player.hasPermission(CustomAnvil.affectedByPluginPermission)) return
- val result = getResult(view, inventory, player, first, second)
- applyResult(event, player, result)
- }
-
- fun getResult(
- view: InventoryView, //TODO use anvil view
- inventory: AnvilInventory,
- player: Player,
- first: ItemStack?, second: ItemStack?) : AnvilResult
- {
- if(first == null)
- return AnvilResult.EMPTY
-
// Test custom recipe
- var result: AnvilResult = testCustomRecipe(view, inventory, player, first, second)
- if (!result.isEmpty())
- return result
+ if (testCustomRecipe(event, inventory, player, first, second)) return
// Test rename lonely item
- val shouldTryRename = second.isAir
- CustomAnvil.verboseLog("checking air in main logic: $shouldTryRename")
- if (shouldTryRename)
- return doRenaming(view, inventory, player, first)
+ if (second == null) {
+ doRenaming(event, inventory, player, first)
+ return
+ }
// Test for merge
- if (first.canMergeWith(second!!))
- return doMerge(view, inventory, player, first, second)
+ if (first.canMergeWith(second)) {
+ doMerge(event, inventory, player, first, second)
+ return
+ }
// Test for unit repair
- result = testUnitRepair(view, inventory, player, first, second)
- if (!result.isEmpty())
- return result
+ if (testUnitRepair(event, inventory, player, first, second)) return
// Test for lore edit
- result = testLoreEdit(player, first, second)
- if (!result.isEmpty())
- return result
+ if (testLoreEdit(event, inventory, player, first, second)) return
- return AnvilResult.EMPTY
- }
+ CustomAnvil.log("no anvil fuse type found")
+ event.result = null
- private fun tryRenameDialog(
- player: HumanEntity,
- event: PrepareAnvilEvent
- ) {
- if(!ConfigOptions.canUseDialogRename(player)) return
-
- AnvilRenameDialogUtil.anvilRenameDialog.tryShowDialog(player, event)
}
private fun isImmutable(item: ItemStack?): Boolean {
- if (item.isAir) return false
+ if (item == null) return false
- val meta = item!!.itemMeta
+ val meta = item.itemMeta
return meta != null &&
(hasImmutableEnchants(meta) || hasImmutableStoredEnchants(meta))
}
@@ -168,14 +127,219 @@ class PrepareAnvilListener : Listener {
return false
}
- private fun applyResult(event: PrepareAnvilEvent, player: Player, result: AnvilResult) {
- event.result = result.item
+ // return true if a custom recipe exist with these ingredients
+ private fun testCustomRecipe(
+ event: PrepareAnvilEvent, inventory: AnvilInventory,
+ player: HumanEntity,
+ first: ItemStack, second: ItemStack?
+ ): Boolean {
+ val recipe = CustomRecipeUtil.getCustomRecipe(first, second)
+ CustomAnvil.verboseLog("custom recipe not null? ${recipe != null}")
+ if (recipe == null) return false
- if(result.item == null) {
- AnvilXpUtil.onNoResult(player, event.view)
- return
- }
- AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, result.cost, result.ignoreXpRules)
+ val amount = CustomRecipeUtil.getCustomRecipeAmount(recipe, first, second)
+
+ val resultItem: ItemStack = recipe.resultItem!!.clone()
+ resultItem.amount *= amount
+
+ // Maybe add an option on custom craft to ignore/not ignore penalty ??
+ val xpCost = recipe.determineCost(amount, first, resultItem)
+
+ val levelCost =
+ if (recipe.removeExactLinearXp) AnvilXpUtil.calculateMinimumLevelForXp(xpCost)
+ else AnvilXpUtil.calculateLevelForXp(xpCost)
+
+ val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.CUSTOM_CRAFT, levelCost)
+ if (finalResult == null) return false
+
+ event.result = finalResult.result
+ if (finalResult.result == null) return false
+
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost, true)
+ return true
}
+ private fun doRenaming(
+ event: PrepareAnvilEvent, inventory: AnvilInventory,
+ player: HumanEntity, first: ItemStack
+ ) {
+ val resultItem = first.clone()
+ var anvilCost = handleRename(resultItem, inventory, player)
+
+ // Test/stop if nothing changed.
+ if (first == resultItem) {
+ CustomAnvil.log("no right item, But input is same as output")
+ event.result = null
+ return
+ }
+
+ anvilCost += AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.RENAME_ONLY)
+
+ val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.RENAME_ONLY, anvilCost)
+ if (finalResult == null) return
+
+ event.result = finalResult.result
+ if (finalResult.result == null) return
+
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
+ }
+
+ private fun handleRename(resultItem: ItemStack, inventory: AnvilInventory, player: HumanEntity): Int {
+ // Can be null
+ var renameText = ChatColor.stripColor(inventory.renameText)
+
+ var sumCost = 0
+ var useColor = false
+ if (ConfigOptions.renameColorPossible && renameText != null) {
+ val component = AnvilColorUtil.handleColor(
+ renameText, player,
+ ConfigOptions.permissionNeededForColor,
+ ConfigOptions.allowColorCode, ConfigOptions.allowHexadecimalColor, ConfigOptions.allowMinimessage,
+ AnvilColorUtil.ColorUseType.RENAME
+ )
+
+ if (component != null) {
+ renameText = MiniMessageUtil.legacy_mm.serialize(component)
+
+ sumCost += ConfigOptions.useOfColorCost
+ useColor = true
+ }
+ }
+
+ // Rename item and add renaming cost
+ resultItem.itemMeta?.let {
+ val hasDisplayName = it.hasDisplayName()
+ val displayName = if (!hasDisplayName) null
+ else if (useColor) it.displayName
+ else ChatColor.stripColor(it.displayName)
+
+
+ if (!displayName.contentEquals(renameText) && !(displayName == null && renameText == "")) {
+ it.setDisplayName(renameText)
+ resultItem.itemMeta = it
+
+ sumCost += ConfigOptions.itemRenameCost
+ }
+
+ return sumCost
+ }
+ return 0
+ }
+
+ private fun doMerge(
+ event: PrepareAnvilEvent, inventory: AnvilInventory,
+ player: HumanEntity,
+ first: ItemStack, second: ItemStack
+ ) {
+ val newEnchants = first.findEnchantments()
+ .combineWith(second.findEnchantments(), first, player)
+ var hasChanged = !isIdentical(first.findEnchantments(), newEnchants)
+
+ val resultItem = first.clone()
+ var anvilCost = 0
+ if(hasChanged){
+ resultItem.setEnchantmentsUnsafe(newEnchants)
+ // Calculate enchantment cost
+ anvilCost+= AnvilXpUtil.getRightValues(second, resultItem)
+ }
+
+ // Calculate repair cost
+ if (!first.isEnchantedBook() && !second.isEnchantedBook()) {
+ // we only need to be concerned with repair when neither item is a book
+ val repaired = resultItem.repairFrom(first, second)
+ anvilCost += if (repaired) ConfigOptions.itemRepairCost else 0
+ hasChanged = hasChanged || repaired
+ }
+
+ // Test/stop if nothing changed.
+ if (!hasChanged) {
+ CustomAnvil.log("Mergable with second, But input is same as output")
+ event.result = null
+ return
+ }
+ // As calculatePenalty edit result, we need to calculate penalty after checking equality
+ anvilCost += AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE)
+ // Calculate rename cost
+ anvilCost += handleRename(resultItem, inventory, player)
+
+ // Finally, we set result
+ val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, anvilCost)
+ if (finalResult == null) return
+
+ event.result = finalResult.result
+ if (finalResult.result == null) return
+
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
+ }
+
+ private fun isIdentical(
+ firstEnchants: MutableMap,
+ resultEnchants: MutableMap
+ ): Boolean {
+ if(firstEnchants.size != resultEnchants.size) return false
+ for (entry in resultEnchants) {
+ if(firstEnchants.getOrDefault(entry.key, entry.value-1) != entry.value) return false
+ }
+
+ return true
+ }
+
+ // return true if there is a valid unit repair with these ingredients
+ private fun testUnitRepair(
+ event: PrepareAnvilEvent, inventory: AnvilInventory, player: HumanEntity,
+ first: ItemStack, second: ItemStack
+ ): Boolean {
+ val unitRepairAmount = first.getRepair(second) ?: return false
+
+ val resultItem = first.clone()
+ var anvilCost = handleRename(resultItem, inventory, player)
+
+ val repairAmount = resultItem.unitRepair(second.amount, unitRepairAmount)
+ if (repairAmount > 0) {
+ anvilCost += repairAmount * ConfigOptions.unitRepairCost
+ }
+ // We do not care about right item penalty for unit repair
+ anvilCost += AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.UNIT_REPAIR)
+
+ // Test/stop if nothing changed.
+ if (first == resultItem) {
+ CustomAnvil.log("unit repair, But input is same as output")
+ event.result = null
+ return true
+ }
+
+ val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.UNIT_REPAIR, anvilCost)
+ if (finalResult == null) return false
+
+ event.result = finalResult.result
+ if (finalResult.result == null) return false
+
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost)
+ return true
+ }
+
+ private fun testLoreEdit(
+ event: PrepareAnvilEvent, inventory: AnvilInventory, player: HumanEntity,
+ first: ItemStack, second: ItemStack
+ ): Boolean {
+ val type = second.type
+ var result: ItemStack? = null
+
+ val xpCost = AtomicInteger()
+ if (Material.WRITABLE_BOOK == type) {
+ result = AnvilLoreEditUtil.tryLoreEditByBook(player, first, second, xpCost)
+ } else if (Material.PAPER == type) {
+ result = AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second, xpCost)
+ }
+
+ if (result == null || first == result) {
+ CustomAnvil.log("lore edit, But input is same as output")
+ event.result = null
+ return false
+ }
+
+ event.result = result
+ AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, xpCost.get())
+ return true
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt
index fd079c3..fa1a977 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/recipe/AnvilCustomRecipe.kt
@@ -3,11 +3,10 @@ package xyz.alexcrea.cuanvil.recipe
import io.delilaheve.CustomAnvil
import org.bukkit.configuration.ConfigurationSection
import org.bukkit.inventory.ItemStack
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant
-import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir
-import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
+import xyz.alexcrea.cuanvil.util.AnvilUseType
+import xyz.alexcrea.cuanvil.util.AnvilXpUtil
class AnvilCustomRecipe(
val name: String,
@@ -81,9 +80,11 @@ class AnvilCustomRecipe(
}
fun validate(): Boolean {
- return !leftItem.isAir &&
- (rightItem == null || !resultItem.isAir) &&
- !resultItem.isAir
+ return (leftItem != null) && !(leftItem!!.type.isAir) && (leftItem!!.amount > 0) &&
+ //(rightItem != null) && !(rightItem!!.type.isAir) && (rightItem!!.amount > 0) &&
+ ((rightItem == null) || (!(rightItem!!.type.isAir) && (rightItem!!.amount > 0))) &&
+ (resultItem != null) && !(resultItem!!.type.isAir) && (resultItem!!.amount > 0)
+
}
fun saveToFile(writeFile: Boolean, doBackup: Boolean) {
@@ -161,7 +162,7 @@ class AnvilCustomRecipe(
CustomAnvil.verboseLog("Testing $name $leftItem")
// We assume this function can be call only if leftItem != null
- // Test if valid
+ // Test is valid
if (!validate()) return false
val leftSimilar = leftItem!!.isSimilar(item1)
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilColorUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilColorUtil.kt
similarity index 81%
rename from src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilColorUtil.kt
rename to src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilColorUtil.kt
index 9564b2e..35ed486 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilColorUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilColorUtil.kt
@@ -1,11 +1,10 @@
-package xyz.alexcrea.cuanvil.util.anvil
+package xyz.alexcrea.cuanvil.util
-import io.delilaheve.util.ConfigOptions
import net.kyori.adventure.text.Component
import org.bukkit.permissions.Permissible
-import xyz.alexcrea.cuanvil.util.MiniMessageUtil
import java.util.regex.Matcher
import java.util.regex.Pattern
+import kotlin.text.indexOf
object AnvilColorUtil {
private val HEX_PATTERN: Pattern = Pattern.compile("#[A-Fa-f0-9]{6}") // pattern to find hexadecimal string
@@ -14,8 +13,7 @@ object AnvilColorUtil {
class ColorPermissions(
val canUseColorCode: Boolean,
val canUseHexColor: Boolean,
- val canUseMinimessage: Boolean,
- val permissible: Permissible, // source of the permission. tried to avoid needing it but meh
+ val canUseMinimessage: Boolean
) {
fun allowed(): Boolean {
return canUseColorCode || canUseHexColor || canUseMinimessage
@@ -38,8 +36,7 @@ object AnvilColorUtil {
return ColorPermissions(
canUseColorCode = false,
canUseHexColor = false,
- canUseMinimessage = false,
- player,
+ canUseMinimessage = false
)
val canUseColorCode =
@@ -57,14 +54,26 @@ object AnvilColorUtil {
useType.hexColorPerm
))
- return ColorPermissions(canUseColorCode, canUseHexColor, canUseMinimessage, player)
+ return ColorPermissions(canUseColorCode, canUseHexColor, canUseMinimessage)
}
- fun renamePermission(player: Permissible): ColorPermissions {
- return calculatePermissions(player,
- ConfigOptions.permissionNeededForColor,
- ConfigOptions.allowColorCode, ConfigOptions.allowHexadecimalColor, ConfigOptions.allowMinimessage,
- ColorUseType.RENAME)
+ /**
+ * Color a string depending on allowed color type, color use type and player permissions
+ * @return colored component or null if nothing has been colored
+ */
+ fun handleColor(
+ textToColorText: String,
+ player: Permissible,
+ usePermission: Boolean,
+ allowColorCode: Boolean,
+ allowHexadecimalColor: Boolean,
+ allowMinimessage: Boolean,
+ useType: ColorUseType
+ ): Component? {
+ val permission = calculatePermissions(player, usePermission,
+ allowColorCode, allowHexadecimalColor, allowMinimessage,
+ useType)
+ return handleColor(textToColorText, permission)
}
/**
@@ -73,10 +82,9 @@ object AnvilColorUtil {
*/
fun handleColor(
textToColorText: String,
- permission: ColorPermissions,
-
- ): Component? {
- if (!permission.allowed()) return null
+ permission: ColorPermissions
+ ): Component? {
+ if(!permission.allowed()) return null
val textToColor = StringBuilder(textToColorText)
var useColor = false
@@ -85,12 +93,7 @@ object AnvilColorUtil {
var nbReplacement = replaceAll(textToColor, "&", "§", 2)
nbReplacement -= 2 * replaceAll(textToColor, "§§", "&", 2)
- if (nbReplacement > 0) {
- useColor = true
-
- if (ConfigOptions.usePerColorCodePermission)
- filterPermissibleColorCode(textToColor, permission.permissible)
- }
+ if (nbReplacement > 0) useColor = true
}
if (permission.canUseHexColor) {
@@ -101,38 +104,23 @@ object AnvilColorUtil {
val previousStr = textToColor.toString()
var result: Component = MiniMessageUtil.legacy_mm.deserialize(previousStr)
- if (permission.canUseMinimessage) {
+ if(permission.canUseMinimessage) {
// we dance with formats here
val toMinimessage = MiniMessageUtil.mm.serialize(result)
val hackySolution = toMinimessage.replace("\\<", "<")
val fromMinimessage = MiniMessageUtil.mm.deserialize(hackySolution)
val asPlain = MiniMessageUtil.plain_text_mm.serialize(fromMinimessage)
- if (previousStr != asPlain) {
+ if(previousStr != asPlain){
useColor = true
result = fromMinimessage
}
}
- return if (useColor) result
+ return if(useColor) result
else null
}
- private fun filterPermissibleColorCode(textToColor: StringBuilder, player: Permissible) {
- var index = 0
- while (true) {
- index = textToColor.indexOf('§', index)
- if (index == -1 || index == textToColor.length - 1) return
-
- val next = textToColor[index + 1]
- // check permission for this color
- if(!player.hasPermission("ca.color.code.$next"))
- textToColor.replace(index, index + 1, "&")
-
- index++
- }
- }
-
/**
* Best effort to revert a component to the smallest allowed string
* that would result in it getting closest as possible to handleColor
@@ -143,12 +131,12 @@ object AnvilColorUtil {
component: Component?,
permission: ColorPermissions
): String? {
- if (!permission.allowed() || component == null) return null
+ if(!permission.allowed() || component == null) return null
val transformed = MiniMessageUtil.mm.serialize(component)
val plainTransform = MiniMessageUtil.plain_text_mm.serialize(component)
- if (transformed == plainTransform) return null
- if (permission.onlyMinimessage()) {
+ if(transformed == plainTransform) return null
+ if(permission.onlyMinimessage()){
return transformed
}
@@ -176,10 +164,10 @@ object AnvilColorUtil {
val hackySolution = hackySolutionStb.toString()
val result: String =
- if (permission.canUseMinimessage) hackySolution
+ if(permission.canUseMinimessage) hackySolution
else MiniMessageUtil.mm.stripTags(hackySolution)
- return if (result == plainTransform) null
+ return if(result == plainTransform) null
else result
}
@@ -221,7 +209,7 @@ object AnvilColorUtil {
while (matcher.find(startIndex)) {
startIndex = matcher.start()
if (startIndex >= builder.length - endOffset) break //HOW AND WHERE WOULD THIS HAPPEN ?????
- if (checkTag && isInTag(builder, startIndex)) {
+ if(checkTag && isInTag(builder, startIndex)) {
startIndex += 1 // Avoid infinite loop
continue
}
@@ -249,7 +237,7 @@ object AnvilColorUtil {
var rightIndex = left.lastIndexOf(">")
// last < do not exist or is before last >
- if (leftIndex == -1 || rightIndex > leftIndex) return false
+ if(leftIndex == -1 || rightIndex > leftIndex) return false
val right = builder.slice(index..(page.split("\n"))
val outLines = ArrayList(lines.size)
- val colorCost = colorLines(
- player, LoreEditType.APPEND_BOOK,
- lines, outLines
- )
+ val colorCost = colorLines(player, LoreEditType.APPEND_BOOK,
+ lines, outLines)
lore.addAll(outLines)
@@ -57,14 +53,14 @@ object AnvilLoreEditUtil {
if (result == first) return null
// Handle xp
- cost.lore = colorCost // Cost of using color
- cost.lore += outLines.size * LoreEditType.APPEND_BOOK.perLineCost // per line cost
- baseEditLoreXpCost(cost, first, result, LoreEditType.APPEND_BOOK) // Fixed cost and work penalty
+ xpCost.addAndGet(colorCost) // Cost of using color
+ xpCost.addAndGet(outLines.size * LoreEditType.APPEND_BOOK.perLineCost) // per line cost
+ xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.APPEND_BOOK)) // Fixed cost and work penalty
return result
}
- fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, cost: AnvilCost): ItemStack? {
+ fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, xpCost: AtomicInteger): ItemStack? {
if (!hasLoreEditByBookPermission(player)) return null
// remove lore
@@ -82,9 +78,9 @@ object AnvilLoreEditUtil {
if (result == first) return null
// Handle xp
- cost.lore = uncolorCost
- cost.lore += currentLore.size * LoreEditType.REMOVE_BOOK.perLineCost
- baseEditLoreXpCost(cost, first, result, LoreEditType.REMOVE_BOOK)
+ xpCost.addAndGet(uncolorCost)
+ xpCost.addAndGet(currentLore.size * LoreEditType.REMOVE_BOOK.perLineCost)
+ xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.REMOVE_BOOK))
return result
}
@@ -120,17 +116,12 @@ object AnvilLoreEditUtil {
return null
}
- fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack): LoreEditResult {
- val isAppend = bookLoreEditIsAppend(first, second) ?: return LoreEditResult.EMPTY
- val type = if (isAppend) LoreEditType.APPEND_BOOK else LoreEditType.REMOVE_BOOK
+ fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack, xpCost: AtomicInteger): ItemStack? {
+ val isAppend = bookLoreEditIsAppend(first, second) ?: return null
val meta = second.itemMeta as BookMeta
- val cost = AnvilCost()
- val item = if (isAppend)
- handleLoreAppendByBook(player, first, meta, cost)
- else handleLoreRemoveByBook(player, first, cost)
-
- return LoreEditResult(item, cost, type)
+ return if (isAppend) handleLoreAppendByBook(player, first, meta, xpCost)
+ else handleLoreRemoveByBook(player, first, xpCost)
}
// Return true if appended, false if removed, null if neither
@@ -156,7 +147,7 @@ object AnvilLoreEditUtil {
player: Permissible,
first: ItemStack,
second: ItemStack,
- cost: AnvilCost
+ xpCost: AtomicInteger
): ItemStack? {
if (!hasLoreEditByPaperPermission(player)) return null
@@ -168,11 +159,9 @@ object AnvilLoreEditUtil {
// A bit overdone to color 1 line but hey
val outList = ArrayList(1)
- val colorCost = colorLines(
- player, LoreEditType.APPEND_PAPER,
+ val colorCost = colorLines(player, LoreEditType.APPEND_PAPER,
Collections.singletonList(second.itemMeta!!.displayName),
- outList
- )
+ outList)
val line = outList[0]
if (appendEnd)
@@ -186,13 +175,13 @@ object AnvilLoreEditUtil {
if (result == first) return null
// Handle xp
- cost.lore = colorCost
- baseEditLoreXpCost(cost, first, result, LoreEditType.APPEND_PAPER)
+ xpCost.addAndGet(colorCost)
+ xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.APPEND_PAPER))
return result
}
- fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, cost: AnvilCost): ItemStack? {
+ fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, xpCost: AtomicInteger): ItemStack? {
if (!hasLoreEditByPaperPermission(player)) return null
// remove lore line
@@ -224,8 +213,8 @@ object AnvilLoreEditUtil {
val uncolorCost = uncolorLine(player, line, LoreEditType.REMOVE_PAPER)
// Handle other xp
- cost.lore = uncolorCost
- baseEditLoreXpCost(cost, first, result, LoreEditType.REMOVE_PAPER)
+ xpCost.addAndGet(uncolorCost)
+ xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.REMOVE_PAPER))
return result
}
@@ -233,39 +222,33 @@ object AnvilLoreEditUtil {
fun tryLoreEditByPaper(
player: HumanEntity,
first: ItemStack,
- second: ItemStack
- ): LoreEditResult {
- val isAppend = paperLoreEditIsAppend(first, second) ?: return LoreEditResult.EMPTY
- val type = if (isAppend) LoreEditType.APPEND_BOOK else LoreEditType.REMOVE_BOOK
+ second: ItemStack,
+ xpCost: AtomicInteger
+ ): ItemStack? {
+ val isAppend = paperLoreEditIsAppend(first, second) ?: return null
- val cost = AnvilCost()
- val item = if (isAppend)
- handleLoreAppendByPaper(player, first, second, cost)
- else handleLoreRemoveByPaper(player, first, cost)
-
- return LoreEditResult(item, cost, type)
+ return if (isAppend) handleLoreAppendByPaper(player, first, second, xpCost)
+ else handleLoreRemoveByPaper(player, first, xpCost)
}
private fun baseEditLoreXpCost(
- cost: AnvilCost,
first: ItemStack,
result: ItemStack,
editType: LoreEditType
- ) {
- cost.lore += editType.fixedCost
+ ): Int {
+ var xpCost = editType.fixedCost
- cost.workPenalty = AnvilXpUtil.calculatePenalty(first, null, result, editType.useType)
+ xpCost += AnvilXpUtil.calculatePenalty(first, null, result, editType.useType)
+ return xpCost
}
fun colorPermission(player: Permissible, editType: LoreEditType): AnvilColorUtil.ColorPermissions {
- return AnvilColorUtil.calculatePermissions(
- player,
+ return AnvilColorUtil.calculatePermissions(player,
false,
editType.allowColorCode,
editType.allowHexColor,
editType.allowMinimessage,
- AnvilColorUtil.ColorUseType.LORE_EDIT
- )
+ AnvilColorUtil.ColorUseType.LORE_EDIT)
}
private fun colorLine(line: String, permission: AnvilColorUtil.ColorPermissions): Component? {
@@ -275,10 +258,8 @@ object AnvilLoreEditUtil {
)
}
- private fun colorLines(
- player: Permissible, editType: LoreEditType,
- lines: List, outLines: MutableList
- ): Int {
+ private fun colorLines(player: Permissible, editType: LoreEditType,
+ lines: List, outLines: MutableList): Int {
val permission = colorPermission(player, editType)
val colorCost = editType.useColorCost
@@ -305,7 +286,7 @@ object AnvilLoreEditUtil {
// Now handle color of each lines
var hasUndidColor = false
for ((index, line) in lines.withIndex()) {
- if (line == null) {
+ if(line == null){
lines[index] = null
continue
}
@@ -320,7 +301,7 @@ object AnvilLoreEditUtil {
hasUndidColor = true
result = clearedLine
} else {
- result = MiniMessageUtil.plain_text_mm.serialize(line)
+ result = MiniMessageUtil.plain_text_mm.serialize(line)
}
lines[index] = MiniMessageUtil.plain_text_mm.deserialize(result)
@@ -349,7 +330,7 @@ object AnvilLoreEditUtil {
var hasUndidColor = false
val result: String
- if (clearedLine != null) {
+ if(clearedLine != null){
hasUndidColor = true
result = clearedLine
} else {
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilUseType.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilUseType.kt
similarity index 66%
rename from src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilUseType.kt
rename to src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilUseType.kt
index 67782f3..d17e908 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilUseType.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilUseType.kt
@@ -1,60 +1,60 @@
-package xyz.alexcrea.cuanvil.anvil
+package xyz.alexcrea.cuanvil.util
import org.bukkit.Material
-import xyz.alexcrea.cuanvil.config.WorkPenaltyType
-import xyz.alexcrea.cuanvil.util.anvil.AnvilUseTypeUtil
+import xyz.alexcrea.cuanvil.config.WorkPenaltyType.WorkPenaltyPart
+import xyz.alexcrea.cuanvil.util.config.LoreEditType
enum class AnvilUseType(
val typeName: String, val path: String,
- val defaultPenalty: WorkPenaltyType.WorkPenaltyPart,
+ val defaultPenalty: WorkPenaltyPart,
val displayName: String, val displayMat: Material
) {
RENAME_ONLY(
"rename_only",
- WorkPenaltyType.WorkPenaltyPart(false, true),
+ WorkPenaltyPart(false, true),
"Rename Only", Material.NAME_TAG
),
MERGE(
"merge",
- WorkPenaltyType.WorkPenaltyPart(true, true),
+ WorkPenaltyPart(true, true),
"Merge", Material.ANVIL
),
UNIT_REPAIR(
"unit_repair",
- WorkPenaltyType.WorkPenaltyPart(true, true),
+ WorkPenaltyPart(true, true),
"Unit Repair", Material.DIAMOND
),
CUSTOM_CRAFT(
"custom_craft",
- WorkPenaltyType.WorkPenaltyPart(false, false),
+ WorkPenaltyPart(false, false),
"Custom Craft", Material.CRAFTING_TABLE
),
LORE_EDIT_BOOK_APPEND(
"lore_edit_book_append", "lore_edit.book_and_quil.append",
- WorkPenaltyType.WorkPenaltyPart(false, false),
+ WorkPenaltyPart(false, false),
"Book Add", Material.WRITABLE_BOOK
),
LORE_EDIT_BOOK_REMOVE(
"lore_edit_book_remove", "lore_edit.book_and_quil.remove",
- WorkPenaltyType.WorkPenaltyPart(false, false),
+ WorkPenaltyPart(false, false),
"Book Remove", Material.WRITABLE_BOOK
),
LORE_EDIT_PAPER_APPEND(
"lore_edit_paper_append", "lore_edit.paper.append_line",
- WorkPenaltyType.WorkPenaltyPart(false, false),
+ WorkPenaltyPart(false, false),
"Paper Add", Material.WRITABLE_BOOK
),
LORE_EDIT_PAPER_REMOVE(
"lore_edit_paper_remove", "lore_edit.paper.remove_line",
- WorkPenaltyType.WorkPenaltyPart(false, false),
+ WorkPenaltyPart(false, false),
"Paper Remove", Material.WRITABLE_BOOK
),
;
constructor(
typeName: String,
- defaultPenalty: WorkPenaltyType.WorkPenaltyPart,
+ defaultPenalty: WorkPenaltyPart,
displayName: String, displayMat: Material
) :
this(
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilUseTypeUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilUseTypeUtil.kt
similarity index 96%
rename from src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilUseTypeUtil.kt
rename to src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilUseTypeUtil.kt
index a9c7f39..c72a35a 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilUseTypeUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilUseTypeUtil.kt
@@ -1,4 +1,4 @@
-package xyz.alexcrea.cuanvil.util.anvil
+package xyz.alexcrea.cuanvil.util
import io.delilaheve.util.ConfigOptions
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt
similarity index 70%
rename from src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt
rename to src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt
index 4846f31..f60581f 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt
@@ -1,4 +1,4 @@
-package xyz.alexcrea.cuanvil.util.anvil
+package xyz.alexcrea.cuanvil.util
import io.delilaheve.CustomAnvil
import io.delilaheve.util.ConfigOptions
@@ -14,59 +14,46 @@ import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.Repairable
import org.bukkit.persistence.PersistentDataType
-import xyz.alexcrea.cuanvil.anvil.AnvilCost
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.group.ConflictType
-import xyz.alexcrea.cuanvil.util.AnvilTitleUtil
-import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
+import kotlin.math.min
object AnvilXpUtil {
const val EXCLUSIVE_PENALTY_PREFIX = "repair_cost"
- /**
- * Display the required cost (either as xp or as )
- */
- fun setAnvilInvCost(
- inventory: AnvilInventory,
- view: InventoryView,
- player: Player,
- cost: AnvilCost,
- ignoreRules: Boolean = false
- ) {
- if (ConfigOptions.shouldUseMoney(player)) {
- cost.isMonetary = true
- setAnvilPrice(inventory, view, player, cost)
- } else
- setAnvilInvXp(inventory, view, player, cost.filteredXpCost(ignoreRules), ignoreRules)
- }
-
- fun maximumXpCost(ignoreRules: Boolean = false): Int {
- return if (ConfigOptions.doRemoveCostLimit || ignoreRules) {
- Int.MAX_VALUE
- } else {
- ConfigOptions.maxAnvilCost + 1
- }
- }
-
/**
* Display xp needed for the work on the anvil inventory
*/
- private fun setAnvilInvXp(
+ fun setAnvilInvXp(
inventory: AnvilInventory,
view: InventoryView,
player: HumanEntity,
anvilCost: Int,
ignoreRules: Boolean = false
) {
- val maximumRepairCost = maximumXpCost(ignoreRules)
+ // Test repair cost limit
+ val finalAnvilCost = if (
+ !ignoreRules &&
+ !ConfigOptions.doRemoveCostLimit &&
+ ConfigOptions.doCapCost
+ ) {
+ min(anvilCost, ConfigOptions.maxAnvilCost)
+ } else {
+ anvilCost
+ }
+
+ val maximumRepairCost =
+ if (ConfigOptions.doRemoveCostLimit || ignoreRules) {
+ Int.MAX_VALUE
+ } else {
+ ConfigOptions.maxAnvilCost + 1
+ }
// Try first just in case another plugin, or the test need this
inventory.maximumRepairCost = maximumRepairCost
- inventory.repairCost = anvilCost
+ inventory.repairCost = finalAnvilCost
// TODO for 2.x.x use anvil view & set directly there
/* Because Minecraft likes to have the final say in the repair cost displayed
@@ -77,65 +64,21 @@ object AnvilXpUtil {
) {
// retry after a tick
inventory.maximumRepairCost = maximumRepairCost
- inventory.repairCost = anvilCost
+ inventory.repairCost = finalAnvilCost
// TODO for 2.x.x use anvil view & set directly there
if (player !is Player) return@scheduleOnEntity
if (player.gameMode != GameMode.CREATIVE) {
val bypassToExpensive = (ConfigOptions.doReplaceTooExpensive) &&
- (anvilCost >= 40) &&
- anvilCost < inventory.maximumRepairCost
+ (finalAnvilCost >= 40) &&
+ finalAnvilCost < inventory.maximumRepairCost
DependencyManager.packetManager.setInstantBuild(player, bypassToExpensive)
}
player.updateInventory()
- }
- }
- /**
- * Display monetary cost needed for the work on the anvil inventory
- */
- private fun setAnvilPrice(
- inventory: AnvilInventory,
- view: InventoryView,
- player: Player,
- cost: AnvilCost,
- ) {
- val finalCost = cost.asMonetaryCost()
-
- val has = player.gameMode == GameMode.CREATIVE ||
- EconomyManager.economy!!.has(player, finalCost)
-
- val text = "Cost: " + (if (has) "§2" else "§4") +
- EconomyManager.economy!!.format(finalCost)
- AnvilTitleUtil.rename(
- view, text,
- player,
- AnvilRenameDialogUtil.anvilRenameDialog,
- CustomAnvil.instance
- )
-
- clearAnvilXpCost(inventory, view, player)
- }
-
- private fun clearAnvilXpCost(
- inventory: AnvilInventory,
- view: InventoryView,
- player: HumanEntity,
- ) {
- // TODO for 2.x.x use anvil view & set directly there
- inventory.repairCost = 0
-
- // retry after a tick
- DependencyManager.scheduler.scheduleOnEntity(
- CustomAnvil.instance, player
- ) {
- inventory.repairCost = 0
-
- if (player !is Player) return@scheduleOnEntity
- player.updateInventory()
}
}
@@ -185,16 +128,6 @@ object AnvilXpUtil {
return resultSum
}
- fun onNoResult(player: HumanEntity, view: InventoryView) {
- if (ConfigOptions.shouldUseMoney(player))
- AnvilTitleUtil.rename(
- view, "Repair & Name",
- player,
- AnvilRenameDialogUtil.anvilRenameDialog,
- CustomAnvil.instance
- )
- }
-
private fun exclusivePenaltyKey(useType: AnvilUseType): NamespacedKey {
return NamespacedKey(CustomAnvil.instance, "${EXCLUSIVE_PENALTY_PREFIX}_${useType.typeName}")
}
@@ -226,8 +159,10 @@ object AnvilXpUtil {
* Function to calculate right enchantment values
* it include enchantment placed on final item and conflicting enchantment
*/
- fun getRightValues(right: ItemStack, result: ItemStack, cost: AnvilCost) {
+ fun getRightValues(right: ItemStack, result: ItemStack): Int {
// Calculate right value and illegal enchant penalty
+ var illegalPenalty = 0
+ var rightValue = 0
val rightIsFormBook = right.isEnchantedBook()
val resultEnchs = result.findEnchantments()
@@ -245,7 +180,7 @@ object AnvilXpUtil {
resultEnchsKeys.remove(enchantment.key)
if (ConflictType.ENCHANTMENT_CONFLICT == conflictType) {
- cost.illegalPenalty += ConfigOptions.sacrificeIllegalCost
+ illegalPenalty += ConfigOptions.sacrificeIllegalCost
CustomAnvil.verboseLog("Big conflict. Adding illegal price penalty")
}
continue
@@ -256,14 +191,16 @@ object AnvilXpUtil {
val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, rightIsFormBook)
val value = resultLevel * enchantmentMultiplier
CustomAnvil.log("Value for ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)")
- cost.enchantment += value
+ rightValue += value
}
CustomAnvil.log(
"Calculated right values: " +
- "rightValue: ${cost.enchantment}, " +
- "illegalPenalty: ${cost.illegalPenalty}"
+ "rightValue: $rightValue, " +
+ "illegalPenalty: $illegalPenalty"
)
+
+ return rightValue + illegalPenalty
}
/**
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt
deleted file mode 100644
index 6b55662..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MaterialUtil.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-package xyz.alexcrea.cuanvil.util
-
-import org.bukkit.Bukkit
-import org.bukkit.Material
-import org.bukkit.NamespacedKey
-import org.bukkit.inventory.ItemStack
-import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.plugins.EcoItemDependencyUtil
-
-object MaterialUtil {
-
- val ItemStack?.isAir: Boolean
- get() {
- return this == null || this.type.isAir || this.amount == 0
- }
-
- val NamespacedKey?.isAir: Boolean
- get() {
- return Material.AIR.key == this
- }
-
- val ItemStack.customType: NamespacedKey
- get() {
- if(DependencyManager.ecoEnchantCompatibility != null) {
- val result = EcoItemDependencyUtil.ecoItemNamespace(this)
- if(result != null) return result
- }
-
- val itemAdder = DependencyManager.itemsAdderCompatibility
- if(itemAdder != null) {
- val result = itemAdder.getKey(this)
- if (result != null) return result
- }
-
- return this.type.key
- }
-
- private fun bukkitMaterialFromKey(key: NamespacedKey): Material? {
- //TODO on paper only transition Registry.MATERIAL.get(key)
- return Material.matchMaterial(key.toString())
- }
-
- fun getMatFromKey(key: NamespacedKey): Material? {
- if(DependencyManager.ecoEnchantCompatibility != null) {
- val result = EcoItemDependencyUtil.ecoItemMaterialFromKey(key)
- if(result != null) return result
- }
-
- val itemAdder = DependencyManager.itemsAdderCompatibility
- if(itemAdder != null) {
- val result = itemAdder.fromKey(key)
- if (result != null) return result.type
- }
-
- return bukkitMaterialFromKey(key)
- }
-
- fun itemFromKey(key: NamespacedKey): ItemStack {
- if(DependencyManager.ecoEnchantCompatibility != null) {
- val result = EcoItemDependencyUtil.newEcoItemstack(key)
- if(result != null) return result
- }
-
- val itemAdder = DependencyManager.itemsAdderCompatibility
- if(itemAdder != null) {
- val result = itemAdder.fromKey(key)
- if (result != null) return result
- }
-
- return ItemStack(bukkitMaterialFromKey(key)!!)
- }
-
- fun materialExist(key: NamespacedKey): Boolean {
- return getMatFromKey(key) != null
- }
-
- fun getMaterialCount(): Int {
- var count = Material.entries.size
- if(DependencyManager.ecoEnchantCompatibility != null) {
- count += EcoItemDependencyUtil.getItems().size
- }
-
- val itemAdder = DependencyManager.itemsAdderCompatibility
- if(itemAdder != null) {
- count += itemAdder.idsCount().size
- }
-
- return count
- }
-
- fun getMaterials(): MutableList {
- val all = ArrayList(Material.entries.map { it.key })
- if(DependencyManager.ecoEnchantCompatibility != null) {
- all.addAll(EcoItemDependencyUtil.getItems())
- }
-
- val itemAdder = DependencyManager.itemsAdderCompatibility
- if(itemAdder != null) {
- all.addAll(itemAdder.idsCount().map { NamespacedKey.fromString(it) })
- }
-
- return all
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt
deleted file mode 100644
index 1763db5..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/MetricsUtil.kt
+++ /dev/null
@@ -1,97 +0,0 @@
-package xyz.alexcrea.cuanvil.util
-
-import dev.faststats.ErrorTracker
-import dev.faststats.bukkit.BukkitContext
-import dev.faststats.data.Metric
-import io.delilaheve.CustomAnvil
-import io.delilaheve.util.ConfigOptions
-import xyz.alexcrea.cuanvil.command.DiagnosticExecutor
-import xyz.alexcrea.cuanvil.config.ConfigHolder
-import xyz.alexcrea.cuanvil.dependency.DependencyManager
-
-object MetricsUtil {
-
- private const val BSTATS_PLUGIN_ID = 20923
- private const val FASTSTATS_TOKEN = "fc282b048adcc71a77bc00ace49e8a81"
-
- private var ERROR_TRACKER: ErrorTracker? = null
- private var FAST_STATS_METRICS: BukkitContext? = null
-
- fun loadMetrics(plugin: CustomAnvil) {
- if(DependencyManager.externGuiTester.isInTest()) return
-
- val config = ConfigHolder.DEFAULT_CONFIG.config
- val metricString = config.getString(ConfigOptions.METRIC_TYPE, MetricType.AUTO.value)!!
- val metricType = MetricType.from(metricString)
-
- val nmsType = DiagnosticExecutor.fetchNMSType()
- val isAlpha = CustomAnvil.instance.description.version.contains("dev")
- if(metricType.allowBStats) {
- try {
- val metric = Metrics(plugin, BSTATS_PLUGIN_ID)
- metric.addCustomChart(Metrics.SimplePie("nms_type") { nmsType })
- metric.addCustomChart(Metrics.SimplePie("using_alpha") { isAlpha.toString() })
- } catch (_: Exception) {}
- }
-
- if(metricType.allowFastStats) {
- // Check support java 17 (metric only work in java 17)
- val versionParts = System.getProperty("java.version").split(".")
- val majorVersion = versionParts[0].toInt()
- if (majorVersion >= 17) try {
- faststatTelemetry(plugin, nmsType, isAlpha)
- } catch (_: Throwable) {}
- }
- }
-
- private fun faststatTelemetry(plugin: CustomAnvil, nmsType: String, isAlpha: Boolean) {
- val config = ConfigHolder.DEFAULT_CONFIG.config
- val reportErrors = config.getBoolean(ConfigOptions.METRIC_COLLECT_ERROR, true)
- if(reportErrors)
- ERROR_TRACKER = ErrorTracker.contextAware()
-
- FAST_STATS_METRICS = BukkitContext.Factory(plugin, FASTSTATS_TOKEN)
- .metrics { factory -> factory
- .addMetric(Metric.string("nms_type") { nmsType })
- .addMetric(Metric.bool("replace_too_expensive") { ConfigOptions.doReplaceTooExpensive })
- .addMetric(Metric.bool("using_alpha") { isAlpha })
- .create()
- }
- .errorTrackerService(ERROR_TRACKER)
- .create()
-
- if(reportErrors) FAST_STATS_METRICS!!.ready()
- }
-
- fun shutdownMetrics() {
- FAST_STATS_METRICS?.shutdown()
- }
-
- var lastError: Throwable? = null
-
- fun trackError(e: Throwable) {
- ERROR_TRACKER?.trackError(e)
- lastError = e
- }
-
- fun trackError(message: String) {
- ERROR_TRACKER?.trackError(message)
- }
-}
-
-enum class MetricType(
- val value: String,
- val allowBStats: Boolean,
- val allowFastStats: Boolean,
-) {
- AUTO("auto", true, true),
- BSTATS("bstat", true, false),
- FAST_STATS("faststats", false, true),
- DISABLED("disabled", false, false),
- ;
-
- companion object {
- fun from(value: String): MetricType = entries.find { it.value == value } ?: AUTO
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/NegativeSet.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/NegativeSet.kt
deleted file mode 100644
index a94175b..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/NegativeSet.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-package xyz.alexcrea.cuanvil.util
-
-open class NegativeSet(val negate: MutableSet = HashSet()) : MutableSet {
-
- override fun iterator(): MutableIterator {
- TODO("Not yet implemented") // can't be implemented I guess
- }
-
- override fun add(element: T): Boolean {
- return negate.remove(element)
- }
-
- override fun remove(element: T): Boolean {
- return negate.add(element)
- }
-
- override fun addAll(elements: Collection): Boolean {
- return negate.removeAll(elements.toSet())
- }
-
- override fun removeAll(elements: Collection): Boolean {
- return negate.addAll(elements)
- }
-
- override fun retainAll(elements: Collection): Boolean {
- TODO("Not yet implemented")
- }
-
- override fun clear() {
- TODO("Not yet implemented")
- }
-
- override fun isEmpty(): Boolean {
- TODO("Not yet implemented")
- }
-
- override val size: Int get() = TODO("Not yet implemented")
-
- override fun contains(element: T): Boolean {
- return !negate.contains(element)
- }
-
- override fun containsAll(elements: Collection): Boolean {
- for (elm in elements) {
- if(negate.contains(elm)) return false
- }
-
- return true
- }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt
index 8463e27..2047e79 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/UnitRepairUtil.kt
@@ -3,7 +3,6 @@ package xyz.alexcrea.cuanvil.util
import org.bukkit.configuration.ConfigurationSection
import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.config.ConfigHolder
-import xyz.alexcrea.cuanvil.util.MaterialUtil.customType
object UnitRepairUtil {
@@ -23,7 +22,7 @@ object UnitRepairUtil {
if (other == null) return null
val config = ConfigHolder.UNIT_REPAIR_HOLDER.config
// Get configuration section if exist
- val otherName = other.customType.key.lowercase()
+ val otherName = other.type.name.lowercase()
var section = config.getConfigurationSection(otherName)
if (section == null) {
section = config.getConfigurationSection(otherName.uppercase())
@@ -45,7 +44,7 @@ object UnitRepairUtil {
* If value is set to less than or equal to 0 then it will be set to default
*/
private fun getRepairAmount(item: ItemStack, section: ConfigurationSection, default: Double): Double? {
- val itemName = item.customType.key.lowercase()
+ val itemName = item.type.name.lowercase()
val repairValue = if (section.isDouble(itemName)) {
section.getDouble(itemName)
} else if (section.isDouble(itemName.uppercase())) {
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/config/LoreEditType.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/config/LoreEditType.kt
index c094c71..8bd926a 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/config/LoreEditType.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/config/LoreEditType.kt
@@ -1,6 +1,6 @@
package xyz.alexcrea.cuanvil.util.config
-import xyz.alexcrea.cuanvil.anvil.AnvilUseType
+import xyz.alexcrea.cuanvil.util.AnvilUseType
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil.ALLOW_COLOR_CODE
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil.ALLOW_HEX_COLOR
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil.ALLOW_MINIMESSAGE
@@ -18,23 +18,20 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder.DEFAULT_CONFIG as CONFIG
enum class LoreEditType(
val rootPath: String,
val useType: AnvilUseType,
- val isBook: Boolean,
val isAppend: Boolean,
val isMultiLine: Boolean,
) {
- APPEND_BOOK(AnvilUseType.LORE_EDIT_BOOK_APPEND, true, true, true),
- REMOVE_BOOK(AnvilUseType.LORE_EDIT_BOOK_REMOVE, true, false, true),
- APPEND_PAPER(AnvilUseType.LORE_EDIT_PAPER_APPEND, false, true, false),
- REMOVE_PAPER(AnvilUseType.LORE_EDIT_PAPER_REMOVE, false, false, false),
+ APPEND_BOOK(AnvilUseType.LORE_EDIT_BOOK_APPEND, true, true),
+ REMOVE_BOOK(AnvilUseType.LORE_EDIT_BOOK_REMOVE, false, true),
+ APPEND_PAPER(AnvilUseType.LORE_EDIT_PAPER_APPEND, true, false),
+ REMOVE_PAPER(AnvilUseType.LORE_EDIT_PAPER_REMOVE, false, false),
;
constructor(
useType: AnvilUseType,
- isPaper: Boolean,
isAppend: Boolean,
isMultiLine: Boolean,
- ) : this(useType.path, useType,
- isPaper, isAppend, isMultiLine)
+ ) : this(useType.path, useType, isAppend, isMultiLine)
/**
* If this edit type is enabled
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/dialog/AnvilRenameDialogUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/dialog/AnvilRenameDialogUtil.kt
deleted file mode 100644
index 07d4e08..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/dialog/AnvilRenameDialogUtil.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package xyz.alexcrea.cuanvil.util.dialog
-
-import io.delilaheve.CustomAnvil
-import io.delilaheve.util.ConfigOptions
-import org.bukkit.entity.HumanEntity
-import org.bukkit.event.inventory.PrepareAnvilEvent
-import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
-import xyz.alexcrea.cuanvil.dialog.AnvilRenameDialog
-import xyz.alexcrea.cuanvil.dialog.AnvilRenameDialogImpl
-import xyz.alexcrea.cuanvil.update.UpdateUtils
-import xyz.alexcrea.cuanvil.util.anvil.AnvilColorUtil
-
-object AnvilRenameDialogUtil {
-
- val anvilRenameDialog: AnvilRenameDialog;
-
- init {
- val version = UpdateUtils.currentMinecraftVersion()
- anvilRenameDialog = (if(!PlatformUtil.isPaper ||
- (version.major <= 1 && version.minor <= 21 && version.patch <= 6)) {
- NoImplAnvilRenameDialog()
- } else {
- AnvilRenameDialogImpl({ player, component -> AnvilColorUtil.revertColorSmallest(
- component, AnvilColorUtil.renamePermission(player)
- ) },
- { ConfigOptions.shouldKeepRenameText },
- { ConfigOptions.renameDialogMaxSize },
- CustomAnvil.instance,
- )
- })
- }
-
- class NoImplAnvilRenameDialog: AnvilRenameDialog {
-
- override fun canSendDialog(): Boolean {
- return false
- }
-
- override fun tryShowDialog(
- player: HumanEntity,
- event: PrepareAnvilEvent
- ) {}
-
- override fun closeInventory(player: HumanEntity) {}
-
- override fun currentText(player: HumanEntity): String? {
- return null
- }
-
- override fun isOpenFor(player: HumanEntity): Boolean {
- return false
- }
-
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 7d6e396..5476ec7 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,21 +1,8 @@
#
-# It is recommended that you use /configanvil to edit most of these config.
+# It is recommended that you use /configanvil to edit theses config.
# You can still manually edit here if you like to. but if you do, don't forget to /anvilconfigreload after you changes !
#
-# What service of metric should custom anvil use
-# Custom anvil collect generic information like server minecraft version, type, etc...
-# It can also collect error information if error is happening (currently faststats only)
-# It can also be disabled
-# Please refer to README for public metric link
-# Possible options: auto, bstat, faststats, disabled (auto by default)
-metric_type: auto
-
-# Allow to report errors made caused by this plugin (only for faststats)
-# This allows me to fix potentials issue that I'm not aware of
-# Accept true or false (true by default)
-metric_collect_errors: true
-
# All anvil cost will be capped to limit_repair_value if enabled.
#
# In other words:
@@ -79,18 +66,6 @@ allow_color_code: false
allow_hexadecimal_color: false
allow_minimessage: false
-# This enables restricting color code for player having specific permission
-# It requires allow_color_code enabled for... obvious reasons
-#
-# For example: if player want to use "&aHello" it will be required that the player has
-# the permission "ca.color.code.a" as he used the color code "a"
-# In general permission to give to the player is "ca.color.code.[code]"
-# where [code] is the color code you wish to allow the player
-#
-# It is kinda of useless when minimessage is supported as players would be able to bypass
-# that using the equivalent minimessage tag
-per_color_code_permission: false
-
# Toggle if color should only be applicable if the player a certain permission.
#
# permission are "ca.color.code" for use of color code and "ca.color.hex" for use of hexadecimal color.
@@ -101,23 +76,10 @@ permission_needed_for_color: true
# Valid values include 0 to 1000.
use_of_color_cost: 0
-# Dialogue rename menu make use of dialog menu to allow bigger rename
-# You can also change the maximum size and set it to -1 or less for maximum
+# Default limit to apply to any enchants missing from enchant_limits
#
-# This feature only work on paper 1.21.7 or later
-#
-# At the moment only english is available for this menu... sorry !
-#
-# CustomAnvil use "ca.rename.dialog" when permission
-enable_dialog_rename: false
-dialog_rename_max_size: 256
-permission_needed_for_dialog_rename: false
-
-# This allows custom anvil to not "guess" the text used for rename but store it in the item
-# It will make item stackable only and only if it had used the same rename text
-#
-# For practical reason. this only work when dialog rename is enabled
-dialog_rename_keep_user_text: true
+# Valid values include 1 to 1000
+default_limit: 5
# Override limits for specific enchants
#
@@ -125,8 +87,7 @@ dialog_rename_keep_user_text: true
#
# Overrides provided default from aqua_affinity to depth_strider won't change effect with extra levels
#
-# Valid range of 0 - 255 for each enchantment
-# -1 mean keep default
+# Valid range of 1 - 255 for each enchantment
enchant_limits:
minecraft:aqua_affinity: 1
minecraft:binding_curse: 1
@@ -308,7 +269,7 @@ enchant_values:
# Even if disable-merge-over of unbreaking is set to 2
# -1 mean enchantment merge for this enchantment is not disabled. default to -1 if absent.
disable-merge-over:
- # Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla on default configuration)
+ # Sharpness is set to -1. it equivalent to it not being set to anything (and work as vanilla)
minecraft:sharpness: -1
# If uncommented. 2 unbreaking II book would not give an unbreaking III book. but unbreaking III book can still be applied
#minecraft:unbreaking: 2
@@ -432,38 +393,16 @@ lore_edit:
allow_hexadecimal_color: false
allow_minimessage: true
-# Allow to replace the xp cost by a monetary cost
-# If enabled it will not be bound to the experience level limits
-#
-# It also requires to enable dialog rename (set "enable_dialog_rename: false" a bit higher)
-# If dialog rename permission is enabled and player do not have the permission merge will fall back to vanilla xp cost
-#
-# If you are using custom craft I recommend using Linear Xp Cost with Exact Linear Xp as normal Xp Cost will act "weird"
-# But Linear Xp will act as 1$ time global multiplier. In other word: like you expect
-#
-# As this feature require dialog rename, it can only be enabled starting with paper 1.21.6 and later
-monetary_cost:
- enabled: false
- # If using vault unlocked this allow to specify what currency should be used for anvil usage
- # default being the default currency
- currency: default
- # multiply the anvil cost by a value to allow to have price a big bigger than like 40
- multipliers:
- # global multipliers. all usage type will be multiplied by this value
- global: 1.0
- # usage specific type. it will only apply for specific xp "reason"
- enchantment: 1.0 # related to enchantments level
- repair: 1.0 # for repairing via unit repair (per unit)
- rename: 1.0 # for renaming the item
- lore_edit: 1.0 # for changing the lore of the item (only if lore edit is enabled)
- illegal_penalty: 1.0 # for trying to combine illegal enchantment
- work_penalty: 1.0 # for work penalty (aka use penalty)
- recipe: 1.0 # for custom anvil recipe cost
-
# Whether to show debug logging
debug_log: false
# Whether to show verbose debug logging
debug_log_verbose: false
+# In case something when wrong with CustomAnvil packet manager.
+# If you see "missing class exception" or similar you may test this.
+# If enabled and Protocolib absent or disabled "Replace to expensive" will not work.
+# ProtocoLib may also be used if the server is in an "unsupported" version even if this option is disabled.
+force_protocolib: false
+
configVersion: 1.11.0
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index dab9997..9449f8b 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -10,10 +10,6 @@ authors: [ DelilahEve, alexcrea ]
libraries: [${libraries}]
commands:
- customanvil:
- description: Generic command for custom anvil
- aliases:
- - ca
anvilconfigreload:
description: Reload every config of this plugin
permission: ca.command.reload
@@ -40,9 +36,6 @@ permissions:
ca.command.reload:
default: op
description: Allow administrator to reload the plugin's configs
- ca.command.diagnostic:
- default: op
- description: Get debug information about the plugin and server
ca.config.edit:
default: op
description: Allow administrator to edit the plugin's config in game
@@ -63,11 +56,6 @@ permissions:
ca.lore_edit.paper:
default: op
description: Allow player to edit lore via paper if enabled (toggleable)
- # dialog menu permission
- ca.rename.dialog:
- default: op
- description: Allow player to use the dialog rename menu (toggleable)
-
# soft depend on old name of this plugin (UnsafeEnchantsPlus), so I can disable it if it is on the same server
# Also depend to other plugin for compatibility
@@ -80,4 +68,3 @@ softdepend:
- eco
- ExcellentEnchants
- HavenBags
- - SuperEnchants
diff --git a/src/test/java/io/delilaheve/CustomAnvilTests.java b/src/test/java/io/delilaheve/CustomAnvilTests.java
index 12e1ec1..45ecb7c 100644
--- a/src/test/java/io/delilaheve/CustomAnvilTests.java
+++ b/src/test/java/io/delilaheve/CustomAnvilTests.java
@@ -8,15 +8,11 @@ public class CustomAnvilTests extends DefaultCustomAnvilTest {
@Test
public void simpleInitTest() {
- try {
- Assertions.assertNotNull(server);
- Assertions.assertNotNull(plugin);
+ Assertions.assertNotNull(server);
+ Assertions.assertNotNull(plugin);
- // Test shutdown
- plugin.onDisable();
- } catch (Exception e) {
- Assertions.fail(e);
- }
+ // Test shutdown
+ plugin.onDisable();
}
}
diff --git a/src/test/java/xyz/alexcrea/cuanvil/api/MaterialGroupApiTests.java b/src/test/java/xyz/alexcrea/cuanvil/api/MaterialGroupApiTests.java
index 3fcafe7..164bc58 100644
--- a/src/test/java/xyz/alexcrea/cuanvil/api/MaterialGroupApiTests.java
+++ b/src/test/java/xyz/alexcrea/cuanvil/api/MaterialGroupApiTests.java
@@ -15,7 +15,7 @@ public class MaterialGroupApiTests extends ConfigResetCustomAnvilTest {
void groupAddAndRemove() {
String groupName = "group";
IncludeGroup group = new IncludeGroup(groupName);
- group.addToPolicy(Material.DIAMOND_PICKAXE.getKey()); // We do not want it to be empty
+ group.addToPolicy(Material.DIAMOND_PICKAXE); // We do not want it to be empty
// Group not being set should not exist
assertFalse(doGroupExist(groupName));
@@ -48,7 +48,7 @@ public class MaterialGroupApiTests extends ConfigResetCustomAnvilTest {
void writeGroup_Reload() {
String groupName = "group";
IncludeGroup group = new IncludeGroup(groupName);
- group.addToPolicy(Material.DIAMOND_PICKAXE.getKey()); // We do not want it to be empty
+ group.addToPolicy(Material.DIAMOND_PICKAXE); // We do not want it to be empty
// Group not being set should not exist
assertFalse(doGroupExist(groupName));
diff --git a/src/test/java/xyz/alexcrea/cuanvil/util/AnvilFuseTestUtil.java b/src/test/java/xyz/alexcrea/cuanvil/util/AnvilFuseTestUtil.java
index 6f5c7bb..1d3c5f4 100644
--- a/src/test/java/xyz/alexcrea/cuanvil/util/AnvilFuseTestUtil.java
+++ b/src/test/java/xyz/alexcrea/cuanvil/util/AnvilFuseTestUtil.java
@@ -195,7 +195,7 @@ public class AnvilFuseTestUtil {
simulateClick(anvil, player, data.expectedResult());
- // Should have simulated the click
+ // Should have similated the click
assertEqual(data.leftItem(), anvil.getFirstItem());
assertEqual(data.rightItem(), anvil.getSecondItem());
assertEqual(data.resultSlotItem(), anvil.getResult());
@@ -260,7 +260,7 @@ public class AnvilFuseTestUtil {
}
public static boolean isAir(@Nullable ItemStack item) {
- return item == null || item.isEmpty() || item.getAmount() == 0;
+ return item == null || item.isEmpty();
}
public static void assertPriceEqual(Integer expectedPrice, int price) {
diff --git a/src/test/resources/plugin.yml b/src/test/resources/plugin.yml
index 37fb95a..c116cce 100644
--- a/src/test/resources/plugin.yml
+++ b/src/test/resources/plugin.yml
@@ -11,8 +11,6 @@ libraries:
- org.jetbrains.kotlin:kotlin-stdlib:2.0.21
commands:
- customanvil:
- description: Generic command for custom anvil
anvilconfigreload:
description: Reload every config of this plugin
permission: ca.command.reload
@@ -39,9 +37,6 @@ permissions:
ca.command.reload:
default: op
description: Allow administrator to reload the plugin's configs
- ca.command.diagnostic:
- default: op
- description: Get debug information about the plugin and server
ca.config.edit:
default: op
description: Allow administrator to edit the plugin's config in game
@@ -60,7 +55,8 @@ permissions:
default: op
description: Allow player to edit lore via paper if enabled (toggleable)
-# soft depend on old name of this plugin (UnsafeEnchantsPlus), so I can disable it if it is on the same server
+
+# soft depend on old name (UnsafeEnchantsPlus), so I can disable it if it is on the same server (old name for this plugin)
# Also depend to other plugin for compatibility
softdepend:
- UnsafeEnchantsPlus
@@ -70,4 +66,3 @@ softdepend:
- EcoEnchants
- eco
- ExcellentEnchants
- - HavenBags