().configureEach {
- sourceCompatibility = "21"
- targetCompatibility = "21"
-
- options.encoding = "UTF-8"
-}
-
-kotlin {
- compilerOptions {
- apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_2)
- jvmTarget.set(JvmTarget.JVM_21)
- }
-}
diff --git a/nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/V1_21R7_PacketManager.kt b/nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/V1_21R7_PacketManager.kt
deleted file mode 100644
index 59ae9ce..0000000
--- a/nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/V1_21R7_PacketManager.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.packet.versions
-
-import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket
-import net.minecraft.world.entity.player.Abilities
-import org.bukkit.craftbukkit.entity.CraftPlayer
-import org.bukkit.entity.Player
-import xyz.alexcrea.cuanvil.dependency.packet.PacketManager
-import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase
-
-class V1_21R7_PacketManager : PacketManagerBase(), PacketManager {
- override val canSetInstantBuild: Boolean
- get() = true
-
- override fun setInstantBuild(player: Player, instantBuild: Boolean) {
- val nmsPlayer = (player as CraftPlayer).handle
- val playerAbilities = nmsPlayer.abilities
- val sendedAbilities: Abilities
- if (playerAbilities.instabuild == instantBuild) {
- sendedAbilities = playerAbilities
- } else {
- sendedAbilities = Abilities()
- sendedAbilities.invulnerable = playerAbilities.invulnerable
- sendedAbilities.flying = playerAbilities.flying
- sendedAbilities.mayfly = playerAbilities.mayfly
- sendedAbilities.instabuild = instantBuild
- sendedAbilities.mayBuild = playerAbilities.mayBuild
- sendedAbilities.flyingSpeed = playerAbilities.flyingSpeed
- sendedAbilities.walkingSpeed = playerAbilities.walkingSpeed
- }
- val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities)
- nmsPlayer.connection.send(packet)
- }
-}
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 9de7d8c..b77c2f3 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -3,20 +3,34 @@ rootProject.name = "CustomAnvil"
// NMS subproject
include("nms:nms-common")
findProject(":nms:nms-common")?.name = "nms-common"
-include("nms:nms-paper")
-findProject(":nms:nms-paper")?.name = "nms-paper"
+include("nms:v1_17R1")
+findProject(":nms:v1_17R1")?.name = "v1_17R1"
+include("nms:v1_18R1")
+findProject(":nms:v1_18R1")?.name = "v1_18R1"
+include("nms:v1_18R2")
+findProject(":nms:v1_18R2")?.name = "v1_18R2"
+include("nms:v1_19R1")
+findProject(":nms:v1_19R1")?.name = "v1_19R1"
+include("nms:v1_19R2")
+findProject(":nms:v1_19R2")?.name = "v1_19R2"
+include("nms:v1_19R3")
+findProject(":nms:v1_19R3")?.name = "v1_19R3"
+include("nms:v1_20R1")
+findProject(":nms:v1_20R1")?.name = "v1_20R1"
+include("nms:v1_20R2")
+findProject(":nms:v1_20R2")?.name = "v1_20R2"
+include("nms:v1_20R3")
+findProject(":nms:v1_20R3")?.name = "v1_20R3"
+include("nms:v1_20R4")
+findProject(":nms:v1_20R4")?.name = "v1_20R4"
+include("nms:v1_21R1")
+findProject(":nms:v1_21R1")?.name = "v1_21R1"
+include("nms:v1_21R2")
+findProject(":nms:v1_21R2")?.name = "v1_21R2"
+include("nms:v1_21R3")
+findProject(":nms:v1_21R3")?.name = "v1_21R3"
+include("nms:v1_21R4")
+findProject(":nms:v1_21R4")?.name = "v1_21R4"
-
-val reobfNMS = providers.gradleProperty("subprojects.reobfnms")
- .get().split(",")
-
-for (nmsPart in reobfNMS) {
- include("nms:$nmsPart")
- findProject(":nms:$nmsPart")?.name = nmsPart
-}
-
-// compatibility subprojects
include(":impl:LegacyEcoEnchant")
-findProject(":impl:LegacyEcoEnchant")?.name = "LegacyEcoEnchant"
-include("impl:ExcellentEnchant5_4")
-findProject(":impl:ExcellentEnchant5_4")?.name = "ExcellentEnchant5_4"
\ No newline at end of file
+findProject(":impl:LegacyEcoEnchant")?.name = "LegacyEcoEnchant"
\ No newline at end of file
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/AnvilRecipeBuilder.java b/src/main/java/xyz/alexcrea/cuanvil/api/AnvilRecipeBuilder.java
index 4292fa0..9d33bfb 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/AnvilRecipeBuilder.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/AnvilRecipeBuilder.java
@@ -14,10 +14,7 @@ public class AnvilRecipeBuilder {
private @NotNull String name;
private boolean exactCount;
- private int levelCostPerCraft;
- private int linearXpCostPerCraft;
-
- private boolean removeExactLinearXp;
+ private int xpCostPerCraft;
private @Nullable ItemStack leftItem;
private @Nullable ItemStack rightItem;
@@ -26,7 +23,7 @@ public class AnvilRecipeBuilder {
/**
* Instantiates a new Anvil recipe builder.
* exact count default to true.
- * xp level and linear cost per craft default to 0.
+ * xp cost per craft default to 1.
*
* @param name The recipe name
*/
@@ -34,9 +31,7 @@ public class AnvilRecipeBuilder {
this.name = name;
this.exactCount = true;
- this.levelCostPerCraft = 0;
- this.linearXpCostPerCraft = 0;
- this.removeExactLinearXp = false;
+ this.xpCostPerCraft = 1;
this.leftItem = null;
this.rightItem = null;
@@ -65,7 +60,7 @@ public class AnvilRecipeBuilder {
}
/**
- * Get if the recipe is exact count. (default 0)
+ * Get if the recipe is exact count.
*
* Exact count mean the recipe can only be crafted 1 by 1.
* If set to false, then it will craft as much as possible in 1 go and will keep unused material onto the anvil inventory.
@@ -91,14 +86,12 @@ public class AnvilRecipeBuilder {
}
/**
- * Get the xp level cost per craft. (default 0)
+ * Get the xp level cost per craft.
*
* @return The xp level cost per craft
- * @deprecated use {@link #getLevelCostPerCraft() getLevelCostPerCraft} instead
*/
- @Deprecated(since = "1.13.0")
public int getXpCostPerCraft() {
- return getLevelCostPerCraft();
+ return xpCostPerCraft;
}
/**
@@ -106,78 +99,9 @@ public class AnvilRecipeBuilder {
*
* @param xpCostPerCraft The xp level cost per craft
* @return This recipe builder instance.
- * @deprecated use {@link #setLevelCostPerCraft(int) setLevelCostPerCraft} instead
*/
- @Deprecated(since = "1.13.0")
public AnvilRecipeBuilder setXpCostPerCraft(int xpCostPerCraft) {
- return setLevelCostPerCraft(xpCostPerCraft);
- }
-
- /**
- * Get the xp level cost per craft. (default 0)
- *
- * @return The xp level cost per craft
- */
- public int getLevelCostPerCraft() {
- return levelCostPerCraft;
- }
-
- /**
- * Sets the xp level cost per craft.
- *
- * @param levelCostPerCraft The xp level cost per craft
- * @return This recipe builder instance.
- */
- public AnvilRecipeBuilder setLevelCostPerCraft(int levelCostPerCraft) {
- this.levelCostPerCraft = levelCostPerCraft;
- return this;
- }
-
- /**
- * Get the linear xp cost (not xp level cost) per craft.
- *
- * @return The xp level cost per craft
- */
- public int getLinearXpCostPerCraft() {
- return linearXpCostPerCraft;
- }
-
- /**
- * Sets the linear xp cost (not xp level cost) per craft.
- *
- * @param linearXpCostPerCraft The linear xp cost per craft
- * @return This recipe builder instance.
- */
- public AnvilRecipeBuilder setLinearXpCostPerCraft(int linearXpCostPerCraft) {
- this.linearXpCostPerCraft = linearXpCostPerCraft;
- return this;
- }
-
- /**
- * Get if the linear xp should get removed by an exact amount.
- *
- * If false (default) level cost will be the level that would be reached by a player with this amount of xp.
- * If true will require the level that has at least the specified level of xp then on click remove only the necessary xp
- *
- * linear xp cost are applied after level cost
- * @return if we should remove the exact amount of linear xp
- */
- public boolean isRemoveExactLinearXp() {
- return removeExactLinearXp;
- }
-
- /**
- * Set if the linear xp should get removed by an exact amount.
- *
- * If false (default) level cost will be the level that would be reached by a player with this amount of xp.
- * If true will require the level that has at least the specified level of xp then on click remove only the necessary xp
- *
- * linear xp cost are applied after level cost
- * @param removeExactLinearXp if we should remove the exact amount of linear xp
- * @return This recipe builder instance.
- */
- public AnvilRecipeBuilder setRemoveExactLinearXp(boolean removeExactLinearXp) {
- this.removeExactLinearXp = removeExactLinearXp;
+ this.xpCostPerCraft = xpCostPerCraft;
return this;
}
@@ -258,14 +182,12 @@ public class AnvilRecipeBuilder {
*/
@Nullable // null if missing argument
public AnvilCustomRecipe build() {
- if (leftItem == null || resultItem == null) return null;
+ if(leftItem == null || resultItem == null) return null;
return new AnvilCustomRecipe(
this.name,
this.exactCount,
- this.levelCostPerCraft,
- this.linearXpCostPerCraft,
- this.removeExactLinearXp,
+ this.xpCostPerCraft,
this.leftItem, this.rightItem, this.resultItem
);
}
@@ -276,7 +198,7 @@ public class AnvilRecipeBuilder {
*
* @return True if successful.
*/
- public boolean registerIfAbsent() {
+ public boolean registerIfAbsent(){
return CustomAnvilRecipeApi.addRecipe(this);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java
index 1460766..f662140 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java
@@ -13,7 +13,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-//TODO add conflict after level
/**
* A Builder for material conflict.
*/
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java b/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java
index ac98225..76f1ac2 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.api;
import io.delilaheve.CustomAnvil;
-import io.delilaheve.util.ConfigOptions;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.enchantments.Enchantment;
@@ -181,13 +180,13 @@ public class EnchantmentApi {
private static boolean tryWriteDefaultConfig(FileConfiguration defaultConfig, CAEnchantment enchantment, boolean override) {
boolean hasChange = false;
- String levelPath = ConfigOptions.ENCHANT_LIMIT_ROOT + "." + enchantment.getKey();
+ String levelPath = "enchant_limits." + enchantment.getKey();
if(override || !defaultConfig.isSet(levelPath)){
defaultConfig.set(levelPath, enchantment.defaultMaxLevel());
hasChange = true;
}
- String basePath = ConfigOptions.ENCHANT_VALUES_ROOT + "." + enchantment.getKey();
+ String basePath = "enchant_values." + enchantment.getKey();
EnchantmentRarity rarity = enchantment.defaultRarity();
String itemPath = basePath + ".item";
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/MaterialGroupApi.java b/src/main/java/xyz/alexcrea/cuanvil/api/MaterialGroupApi.java
index cd71c7a..48dd500 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/MaterialGroupApi.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/MaterialGroupApi.java
@@ -3,7 +3,6 @@ package xyz.alexcrea.cuanvil.api;
import io.delilaheve.CustomAnvil;
import io.delilaheve.util.ConfigOptions;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.configuration.file.FileConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -124,7 +123,7 @@ public class MaterialGroupApi {
FileConfiguration config = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
String basePath = group.getName() + ".";
- Set materialSet = group.getNonGroupInheritedMaterials();
+ Set materialSet = group.getNonGroupInheritedMaterials();
Set groupSet = group.getGroups();
boolean empty = true;
@@ -154,7 +153,7 @@ public class MaterialGroupApi {
FileConfiguration config = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
String basePath = group.getName() + ".";
- Set materials = group.getMaterials();
+ EnumSet materials = group.getMaterials();
if (materials.isEmpty()) return false;
@@ -164,8 +163,8 @@ public class MaterialGroupApi {
return true;
}
- public static List materialSetToStringList(@NotNull Set materials) {
- return materials.stream().map(NamespacedKey::toString).toList();
+ public static List materialSetToStringList(@NotNull Set materials) {
+ return materials.stream().map(material -> material.getKey().getKey().toLowerCase()).toList();
}
public static List materialGroupSetToStringList(@NotNull Set groups) {
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/CAConfigReadyEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/CAConfigReadyEvent.java
index 67d27a8..24691db 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/CAConfigReadyEvent.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/CAConfigReadyEvent.java
@@ -3,23 +3,6 @@ package xyz.alexcrea.cuanvil.api.event;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
-/**
- * Called when the configuration of CustomAnvil is ready.
- * It is called either on the plugin startup or on the plugin config reload.
- *
- * If you want to listen to the first trigger of this event (first configuration load. aka plugin load)
- * you will need to register the listener on your plugin onEnable or earlier
- *
- * This event indicate that can start to register your recipes, item groups and conflicts.
- * The vanilla and custom enchantments should already have been provided to CustomAnvil.
- * Configuration can be changed any time after this event is triggered but never before.
- *
- * use {@link xyz.alexcrea.cuanvil.api.ConflictAPI ConflictApi},
- * {@link xyz.alexcrea.cuanvil.gui.config.global.CustomRecipeConfigGui CustomRecipeConfigGui},
- * {@link xyz.alexcrea.cuanvil.api.MaterialGroupApi MaterialGroupApi}
- * and {@link xyz.alexcrea.cuanvil.api.UnitRepairApi UnitRepairApi}
- * to add/remove/edit configurations
- */
public class CAConfigReadyEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList();
diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/CAEnchantRegistryReadyEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/CAEnchantRegistryReadyEvent.java
index 3ffe372..3e2fdf8 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/CAEnchantRegistryReadyEvent.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/CAEnchantRegistryReadyEvent.java
@@ -3,17 +3,6 @@ package xyz.alexcrea.cuanvil.api.event;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
-/**
- * Called when custom anvil is ready to accept registration on custom enchantment.
- *
- * If you want to listen this event
- * you will need to register the listener on your plugin onEnable or earlier
- *
- * Custom enchantments may be registered later but may cause issue if registered too later
- * (after configuration loading phase. see {@link CAConfigReadyEvent})
- *
- * use {@link xyz.alexcrea.cuanvil.api.EnchantmentApi EnchantmentApi} to register and unregister your custom enchantments
- */
public class CAEnchantRegistryReadyEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList();
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
deleted file mode 100644
index fe5e199..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAClickResultBypassEvent.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package xyz.alexcrea.cuanvil.api.event.listener;
-
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Called before custom anvil process the click on the result on the anvil inventory.
- *
- * This event is called after checking that the inventory is an anvil inventory and that the click is on the result slot
- * but before checking if the player has the custom anvil affected permission.
- *
- * This event being cancelled will make CustomAnvil abort the click on result process.
- *
- * 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.
- */
-public class CAClickResultBypassEvent extends Event implements Cancellable {
-
- private static final HandlerList HANDLERS = new HandlerList();
-
- public static HandlerList getHandlerList() {
- return HANDLERS;
- }
-
- @Override
- public @NotNull HandlerList getHandlers() {
- return HANDLERS;
- }
-
- private boolean cancelled = false;
-
- @Override
- public boolean isCancelled() {
- return cancelled;
- }
-
- @Override
- public void setCancelled(boolean cancel) {
- this.cancelled = cancel;
- }
-
- @NotNull
- private final InventoryClickEvent event;
-
- /**
- * Get the bukkit inventory click event causing to this event
- *
- * @return The click event causing to this event
- */
- @NotNull
- public InventoryClickEvent getEvent() {
- return event;
- }
-
- public CAClickResultBypassEvent(@NotNull InventoryClickEvent event) {
- this.event = event;
- }
-}
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
deleted file mode 100644
index e92b4cd..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAEarlyPreAnvilBypassEvent.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package xyz.alexcrea.cuanvil.api.event.listener;
-
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.inventory.PrepareAnvilEvent;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Called before custom anvil process the prepare anvil event.
- *
- * This event will always get called when CustomAnvil need to handle
- *
- * This event being cancelled will make CustomAnvil abort the anvil process.
- *
- * 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}
- * as your use case may be more prone to use theses.
- */
-public class CAEarlyPreAnvilBypassEvent extends Event implements Cancellable {
-
- private static final HandlerList HANDLERS = new HandlerList();
-
- public static HandlerList getHandlerList() {
- return HANDLERS;
- }
-
- @Override
- public @NotNull HandlerList getHandlers() {
- return HANDLERS;
- }
-
- private boolean cancelled = false;
-
- @Override
- public boolean isCancelled() {
- return cancelled;
- }
-
- @Override
- public void setCancelled(boolean cancel) {
- this.cancelled = cancel;
- }
-
- @NotNull
- private final PrepareAnvilEvent event;
-
- /**
- * Get the bukkit pre anvil event causing this event
- *
- * @return The pre anvil event causing to this event
- */
- @NotNull
- public PrepareAnvilEvent getEvent() {
- return event;
- }
-
- public CAEarlyPreAnvilBypassEvent(@NotNull PrepareAnvilEvent event) {
- this.event = event;
- }
-
-}
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
deleted file mode 100644
index 9103a4b..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CAPreAnvilBypassEvent.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package xyz.alexcrea.cuanvil.api.event.listener;
-
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.inventory.PrepareAnvilEvent;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Called before custom anvil process the prepare anvil event.
- *
- * This event is called after {@link CAEarlyPreAnvilBypassEvent},
- * after checking that there is at least an item on the left slot
- * and after checking if any of the 2 item is marked as immutable
- * but before checking if the player has the custom anvil affected permission.
- *
- * This event being cancelled will make CustomAnvil abort the anvil process.
- *
- * 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}
- * as your use case may be more prone to use theses.
- */
-public class CAPreAnvilBypassEvent extends Event implements Cancellable {
-
- private static final HandlerList HANDLERS = new HandlerList();
-
- public static HandlerList getHandlerList() {
- return HANDLERS;
- }
-
- @Override
- public @NotNull HandlerList getHandlers() {
- return HANDLERS;
- }
-
- private boolean cancelled = false;
-
- @Override
- public boolean isCancelled() {
- return cancelled;
- }
-
- @Override
- public void setCancelled(boolean cancel) {
- this.cancelled = cancel;
- }
-
- @NotNull
- private final PrepareAnvilEvent event;
-
- /**
- * Get the bukkit pre anvil event causing this event
- *
- * @return The pre anvil event causing this event
- */
- @NotNull
- public PrepareAnvilEvent getEvent() {
- return event;
- }
-
- public CAPreAnvilBypassEvent(@NotNull PrepareAnvilEvent event) {
- this.event = event;
- }
-
-}
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
deleted file mode 100644
index 80965b5..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package xyz.alexcrea.cuanvil.api.event.listener;
-
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-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;
-
-/**
- * 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 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();
-
- public static HandlerList getHandlerList() {
- return HANDLERS;
- }
-
- @Override
- public @NotNull HandlerList getHandlers() {
- return HANDLERS;
- }
-
- @NotNull
- private final PrepareAnvilEvent event;
-
- private final AnvilUseType useType;
-
- @Nullable
- private ItemStack result;
-
- private final AnvilCost cost;
-
- public CATreatAnvilResultEvent(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, AnvilCost cost) {
- this.event = event;
- this.useType = useType;
- this.result = result;
- this.cost = cost;
- }
-
- /**
- * Get the bukkit inventory click event causing to this event.
- *
- * @return The click event causing to this event.
- */
- public @NotNull PrepareAnvilEvent getEvent() {
- return event;
- }
-
- /**
- * Get the type of use source of the result.
- *
- * @return The craft use type.
- */
- public AnvilUseType getUseType() {
- return useType;
- }
-
- /**
- * 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/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/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java
index ea657ac..1d94ba2 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java
@@ -207,6 +207,7 @@ public interface CAEnchantment {
@NotNull ItemMeta meta,
@NotNull Map enchantments,
@NotNull Collection enchantmentToTest){
+
for (CAEnchantment enchantment : enchantmentToTest) {
if(enchantment.isEnchantmentPresent(item, meta)){
enchantments.put(enchantment, enchantment.getLevel(item, meta));
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/BukkitEnchantBulkOperation.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java
index 73e4185..c5bd07d 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/bulk/BukkitEnchantBulkOperation.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.enchant.bulk;
import io.delilaheve.CustomAnvil;
-import io.delilaheve.util.ConfigOptions;
import io.delilaheve.util.ItemUtil;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
@@ -18,14 +17,11 @@ public class BukkitEnchantBulkOperation implements BulkGetEnchantOperation, Bulk
@Override
public void bulkGet(@NotNull Map enchantmentMap, @NotNull ItemStack item, @NotNull ItemMeta meta) {
- boolean isBook = ItemUtil.INSTANCE.isEnchantedBook(item);
-
- if (isBook) {
+ if (ItemUtil.INSTANCE.isEnchantedBook(item)) {
((EnchantmentStorageMeta) meta).getStoredEnchants().forEach((enchantment, level) ->
addEnchantment(enchantmentMap, enchantment, level)
);
- }
- if(!isBook || ConfigOptions.INSTANCE.getAddBookEnchantmentAsStoredEnchantment()){
+ } else {
item.getEnchantments().forEach((enchantment, level) ->
addEnchantment(enchantmentMap, enchantment, level)
);
@@ -45,7 +41,7 @@ public class BukkitEnchantBulkOperation implements BulkGetEnchantOperation, Bulk
@Override
public void bulkClear(@NotNull ItemStack item) {
- if (item.getType() != Material.ENCHANTED_BOOK || ConfigOptions.INSTANCE.getAddBookEnchantmentAsStoredEnchantment()) {
+ if (item.getType() != Material.ENCHANTED_BOOK) {
item.getEnchantments().forEach((enchantment, level) ->
item.removeEnchantment(enchantment)
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/CABukkitEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CABukkitEnchantment.java
index 0e630ea..1a72458 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CABukkitEnchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CABukkitEnchantment.java
@@ -1,7 +1,6 @@
package xyz.alexcrea.cuanvil.enchant.wrapped;
import io.delilaheve.CustomAnvil;
-import io.delilaheve.util.ConfigOptions;
import io.delilaheve.util.ItemUtil;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
@@ -29,14 +28,14 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
public final @NotNull Enchantment bukkit;
- public CABukkitEnchantment(@NotNull Enchantment bukkit, @Nullable EnchantmentRarity rarity) {
+ public CABukkitEnchantment(@NotNull Enchantment bukkit, @Nullable EnchantmentRarity rarity){
super(bukkit.getKey(),
rarity,
bukkit.getMaxLevel());
this.bukkit = bukkit;
}
- public CABukkitEnchantment(@NotNull Enchantment bukkit) {
+ public CABukkitEnchantment(@NotNull Enchantment bukkit){
this(bukkit, getRarity(bukkit));
}
@@ -53,7 +52,7 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
@Override
public int getLevel(@NotNull ItemStack item, @NotNull ItemMeta meta) {
if (ItemUtil.INSTANCE.isEnchantedBook(item)) {
- return ((EnchantmentStorageMeta) meta).getStoredEnchantLevel(this.bukkit);
+ return ((EnchantmentStorageMeta)meta).getStoredEnchantLevel(this.bukkit);
} else {
return meta.getEnchantLevel(this.bukkit);
}
@@ -62,11 +61,10 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
@Override
public boolean isEnchantmentPresent(@NotNull ItemStack item, @NotNull ItemMeta meta) {
if (ItemUtil.INSTANCE.isEnchantedBook(item)) {
- EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta) meta);
+ EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)meta);
- return bookMeta.getStoredEnchants().containsKey(this.bukkit) ||
- (ConfigOptions.INSTANCE.getAddBookEnchantmentAsStoredEnchantment() && item.containsEnchantment(this.bukkit));
- } else {
+ return bookMeta.getStoredEnchants().containsKey(this.bukkit);
+ }else{
return item.containsEnchantment(this.bukkit);
}
}
@@ -74,7 +72,7 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
@Override
public void addEnchantmentUnsafe(@NotNull ItemStack item, int level) {
if (ItemUtil.INSTANCE.isEnchantedBook(item)) {
- EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta) item.getItemMeta());
+ EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)item.getItemMeta());
assert bookMeta != null;
bookMeta.addStoredEnchant(this.bukkit, level, true);
@@ -88,20 +86,19 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
@Override
public void removeFrom(@NotNull ItemStack item) {
if (ItemUtil.INSTANCE.isEnchantedBook(item)) {
- EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta) item.getItemMeta());
+ EnchantmentStorageMeta bookMeta = ((EnchantmentStorageMeta)item.getItemMeta());
assert bookMeta != null;
bookMeta.removeStoredEnchant(this.bukkit);
- bookMeta.removeEnchant(this.bukkit);
item.setItemMeta(bookMeta);
- } else {
+ }else{
item.removeEnchantment(this.bukkit);
}
}
@NotNull
- public static EnchantmentRarity getRarity(Enchantment enchantment) {
+ public static EnchantmentRarity getRarity(Enchantment enchantment){
try {
return EnchantmentProperties.valueOf(enchantment.getKey().getKey().toUpperCase(Locale.ENGLISH)).getRarity();
} catch (IllegalArgumentException ignored) {
@@ -115,7 +112,6 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
}
private static Method getAnvilCostMethod;
-
static {
Class clazz = Enchantment.class;
try {
@@ -148,14 +144,14 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
}
private static EnchantmentRarity findRarity(Enchantment enchantment) {
- if (getAnvilCostMethod == null) return EnchantmentRarity.COMMON;
+ if(getAnvilCostMethod == null) return EnchantmentRarity.COMMON;
try {
int itemCost = (int) getAnvilCostMethod.invoke(enchantment);
return EnchantmentRarity.getRarity(itemCost);
} catch (IllegalAccessException | InvocationTargetException e) {
- CustomAnvil.instance.getLogger().log(Level.SEVERE, "could not find cost for enchantment " + enchantment.getKey(), e);
+ CustomAnvil.instance.getLogger().log(Level.SEVERE, "could not find cost for enchantment "+enchantment.getKey(), e);
return EnchantmentRarity.COMMON;
}
@@ -164,7 +160,7 @@ public class CABukkitEnchantment extends CAEnchantmentBase {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof CABukkitEnchantment other)) {
+ if(!(obj instanceof CABukkitEnchantment other)){
return false;
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEEnchantment.java
similarity index 50%
rename from src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java
rename to src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEEnchantment.java
index 783798d..72c333f 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEPreV5Enchantment.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEEnchantment.java
@@ -1,46 +1,31 @@
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.enchantment.Definition;
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 CAEEPreV5Enchantment extends CABukkitEnchantment implements AdditionalTestEnchantment {
+public class CAEEEnchantment extends CABukkitEnchantment implements AdditionalTestEnchantment {
@NotNull CustomEnchantment eeenchantment;
@NotNull Definition definition;
- public CAEEPreV5Enchantment(@NotNull CustomEnchantment enchantment) {
- super(enchantment.getBukkitEnchantment(), getRarity(enchantment.getBukkitEnchantment()));
+ public CAEEEnchantment(@NotNull CustomEnchantment enchantment) {
+ super(enchantment.getBukkitEnchantment(), EnchantmentRarity.getRarity(enchantment.getDefinition().getAnvilCost()));
this.eeenchantment = enchantment;
- try {
- this.definition = (Definition) getDefinition.invoke(enchantment);
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new RuntimeException(e);
- }
+ this.definition = enchantment.getDefinition();
}
- private final static Method getDefinition;
- static {
- try {
- getDefinition = CustomEnchantment.class.getMethod("getDefinition");
- } catch (NoSuchMethodException e) {
- throw new RuntimeException(e);
- }
- }
-
@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 +38,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
deleted file mode 100644
index 2d8f945..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEEV5Enchantment.java
+++ /dev/null
@@ -1,128 +0,0 @@
-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 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;
-
- public CAEEV5Enchantment(@NotNull CustomEnchantment enchantment) {
- super(enchantment.getBukkitEnchantment(), EnchantmentRarity.getRarity(getAnvilCost(enchantment)));
- this.eeenchantment = enchantment;
- this.definition = getDefinition(enchantment);
-
- }
-
- @Override
- public boolean isEnchantConflict(@NotNull Map enchantments, @NotNull NamespacedKey itemType) {
- if (!hasConflicts()) return false;
-
- Set conflicts = 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;
-
- String key = itemType.getKey();
- ItemSet primary = eeenchantment.getPrimaryItems();
- if (primary.getMaterials().contains(key)) return false;
-
- ItemSet supported = eeenchantment.getSupportedItems();
- if (supported.getMaterials().contains(key)) return false;
-
- 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/MainConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java
index cc4fddc..e2224f7 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/MainConfigGui.java
@@ -103,8 +103,8 @@ public class MainConfigGui extends ChestGui {
ItemMeta groupMeta = groupItemstack.getItemMeta();
assert groupMeta != null;
- groupMeta.setDisplayName("§aItem Groups");
- groupMeta.setLore(Collections.singletonList("§7Click here to open item group menu"));
+ groupMeta.setDisplayName("§aGroups");
+ groupMeta.setLore(Collections.singletonList("§7Click here to open material group menu"));
groupItemstack.setItemMeta(groupMeta);
GuiItem groupConfigItem = GuiGlobalItems.goToGuiItem(groupItemstack, GroupConfigGui.getInstance());
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/AbstractEnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java
index 6bd7ea3..a65b54b 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java
@@ -20,7 +20,7 @@ import java.util.function.Consumer;
*
* @param Type of the factory of the type of setting the gui should edit.
*/
-public abstract class AbstractEnchantConfigGui extends SettingGuiListConfigGui{
+public abstract class AbstractEnchantConfigGui extends SettingGuiListConfigGui implements ValueUpdatableGui {
/**
* Constructor for a gui displaying available enchantment to edit a enchantment setting.
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/CustomRecipeConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java
index e21ad75..feaa8dd 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java
@@ -14,7 +14,7 @@ import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe;
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
public class CustomRecipeConfigGui extends MappedGuiListConfigGui getRecipeLore(AnvilCustomRecipe recipe) {
- boolean shouldWork = recipe.validate();
-
- ArrayList lore = new ArrayList<>();
- lore.add("§7Is valid: §" + (shouldWork ? "aYes" : "cNo"));
- lore.add("§7Exact count: §" + (recipe.getExactCount() ? "aYes" : "cNo"));
- lore.add("§7Recipe Level Cost: §e" + recipe.getLevelCostPerCraft());
- lore.add("§7Recipe Linear Xp Cost: §e" + recipe.getXpCostPerCraft());
- if (recipe.getXpCostPerCraft() != 0) {
- lore.add("§7Exact Linear xp remove: §" + (recipe.getRemoveExactLinearXp() ? "aYes" : "cNo"));
- }
- return lore;
- }
-
@Override
protected LazyElement newInstanceOfGui(AnvilCustomRecipe generic, GuiItem item) {
return new LazyElement<>(item, () -> new CustomRecipeSubSettingGui(this, generic));
@@ -94,11 +87,7 @@ public class CustomRecipeConfigGui extends MappedGuiListConfigGui {
- 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/CustomRecipeSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java
index 9db6d62..d5ca2c8 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java
@@ -36,32 +36,26 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
public CustomRecipeSubSettingGui(
@NotNull CustomRecipeConfigGui parent,
@NotNull AnvilCustomRecipe anvilRecipe) {
- super(4, "§e" + CasedStringUtil.snakeToUpperSpacedCase(anvilRecipe.toString()) + " §8Config");
+ super(3, "§e" + CasedStringUtil.snakeToUpperSpacedCase(anvilRecipe.toString()) + " §8Config");
this.parent = parent;
this.anvilRecipe = anvilRecipe;
Pattern pattern = new Pattern(
GuiSharedConstant.EMPTY_GUI_FULL_LINE,
"01203450D",
- "0ab000000",
"B00000000"
);
- this.pane = new PatternPane(0, 0, 9, 4, pattern);
+ this.pane = new PatternPane(0, 0, 9, 3, pattern);
addPane(this.pane);
prepareStaticValues();
}
- private BoolSettingsGui.BoolSettingFactory exactCountFactory;
- private BoolSettingsGui.BoolSettingFactory removeExactLinearXpFactory;
- private GuiItem noRemoveExactLinearXp;
-
- private IntSettingsGui.IntSettingFactory levelCostFactory;
- private IntSettingsGui.IntSettingFactory linearXpCostFactory;
-
- private ItemSettingGui.ItemSettingFactory leftItemFactory;
- private ItemSettingGui.ItemSettingFactory rightItemFactory;
- private ItemSettingGui.ItemSettingFactory resultItemFactory;
+ BoolSettingsGui.BoolSettingFactory exactCountFactory;
+ IntSettingsGui.IntSettingFactory xpCostFactory;
+ ItemSettingGui.ItemSettingFactory leftItemFactory;
+ ItemSettingGui.ItemSettingFactory rightItemFactory;
+ ItemSettingGui.ItemSettingFactory resultItemFactory;
private void prepareStaticValues() {
@@ -80,38 +74,19 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
this.pane.bindItem('D', new GuiItem(deleteItem, GuiGlobalActions.openGuiAction(createDeleteGui()), CustomAnvil.instance));
// Displayed item will be updated later
+
IntRange costRange = AnvilCustomRecipe.Companion.getXP_COST_CONFIG_RANGE();
this.exactCountFactory = new BoolSettingsGui.BoolSettingFactory("§8Exact count ?", this,
ConfigHolder.CUSTOM_RECIPE_HOLDER,
this.anvilRecipe + "." + AnvilCustomRecipe.EXACT_COUNT_CONFIG, AnvilCustomRecipe.DEFAULT_EXACT_COUNT_CONFIG);
- this.removeExactLinearXpFactory = new BoolSettingsGui.BoolSettingFactory("§8Remove exact linear xp ?", this,
- ConfigHolder.CUSTOM_RECIPE_HOLDER,
- this.anvilRecipe + "." + AnvilCustomRecipe.REMOVE_EXACT_XP_CONFIG, AnvilCustomRecipe.DEFAULT_REMOVE_EXACT_XP_CONFIG);
-
- ItemStack item = new ItemStack(Material.BARRIER);
- ItemMeta meta = item.getItemMeta();
- assert meta != null;
-
- meta.setDisplayName("§cRemove exact linear xp ?");
- meta.setLore(Collections.singletonList("§7Not usable if linear cost is 0"));
- item.setItemMeta(meta);
- this.noRemoveExactLinearXp = new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
-
- this.levelCostFactory = new IntSettingsGui.IntSettingFactory("§8Recipe Level Cost", this,
- this.anvilRecipe + "." + AnvilCustomRecipe.XP_LEVEL_COST_CONFIG,
+ this.xpCostFactory = new IntSettingsGui.IntSettingFactory("§8Recipe Xp Cost", this,
+ this.anvilRecipe +"."+AnvilCustomRecipe.XP_COST_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER,
null,
- costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.DEFAULT_XP_LEVEL_COST_CONFIG, 1, 5, 10);
-
- this.linearXpCostFactory = new IntSettingsGui.IntSettingFactory("§8Recipe Linear Xp Cost", this,
- this.anvilRecipe + "." + AnvilCustomRecipe.LINEAR_XP_COST_CONFIG,
- ConfigHolder.CUSTOM_RECIPE_HOLDER,
- null,
- 0, Integer.MAX_VALUE, AnvilCustomRecipe.DEFAULT_LINEAR_XP_COST_CONFIG, 1, 10, 100, 1000, 10000);
+ costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.DEFAULT_XP_COST_CONFIG, 1, 5, 10);
- // Right part of the gui
this.leftItemFactory = new ItemSettingGui.ItemSettingFactory("§eRecipe Left §8Item", this,
this.anvilRecipe + "." + AnvilCustomRecipe.LEFT_ITEM_CONFIG,
ConfigHolder.CUSTOM_RECIPE_HOLDER,
@@ -183,18 +158,8 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
GuiItem exactCountItem = this.exactCountFactory.getItem();
this.pane.bindItem('1', exactCountItem);
- if (anvilRecipe.getXpCostPerCraft() == 0) {
- this.pane.bindItem('a', noRemoveExactLinearXp);
- } else {
- this.pane.bindItem('a', removeExactLinearXpFactory.getItem());
- }
-
- GuiItem levelCostItem = this.levelCostFactory.getItem(Material.EXPERIENCE_BOTTLE);
- this.pane.bindItem('2', levelCostItem);
-
-
- GuiItem xpCostItem = this.linearXpCostFactory.getItem(Material.EXPERIENCE_BOTTLE);
- this.pane.bindItem('b', xpCostItem);
+ GuiItem xpCostItem = this.xpCostFactory.getItem(Material.EXPERIENCE_BOTTLE);
+ this.pane.bindItem('2', xpCostItem);
GuiItem leftGuiItem = this.leftItemFactory.getItem();
this.pane.bindItem('3', leftGuiItem);
@@ -204,7 +169,7 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
GuiItem resultGuiItem = this.resultItemFactory.getItem();
this.pane.bindItem('5', resultGuiItem);
-
+
update();
}
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..efa1117 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;
@@ -40,7 +39,7 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
@NotNull GroupConfigGui parent,
@NotNull IncludeGroup group) {
super(3,
- "§e" + CasedStringUtil.snakeToUpperSpacedCase(group.getName()) + " §rConfig");
+ CasedStringUtil.snakeToUpperSpacedCase(group.getName()) + " Config");
this.parent = parent;
this.group = group;
@@ -72,31 +71,20 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
this.pane.bindItem('D', new GuiItem(deleteItem, openGuiAndCheckAction(), CustomAnvil.instance));
// Displayed item will be updated later
- String materialSelectionName = "§e" + CasedStringUtil.snakeToUpperSpacedCase(group.getName()) + " §rMaterials";
- ItemStack selectItem = new ItemStack(Material.DIAMOND_SWORD);
- ItemMeta selectItemMeta = selectItem.getItemMeta();
- selectItemMeta.setDisplayName(materialSelectionName);
-
- selectItem.setItemMeta(selectItemMeta);
- this.materialSelection = new GuiItem(selectItem, (event) -> {
+ this.materialSelection = new GuiItem(new ItemStack(Material.DIAMOND_SWORD), (event) -> {
event.setCancelled(true);
+
MaterialSelectSettingGui selectGui = new MaterialSelectSettingGui(this,
- materialSelectionName
+ CasedStringUtil.snakeToUpperSpacedCase(group.getName()) + " Materials"
, this);
selectGui.show(event.getWhoClicked());
}, CustomAnvil.instance);
- String selectGroupName = "§e" + CasedStringUtil.snakeToUpperSpacedCase(this.group.getName()) + " §rGroups";
- ItemStack selectGroup = new ItemStack(Material.CHEST);
- ItemMeta selectGroupMeta = selectGroup.getItemMeta();
- selectGroupMeta.setDisplayName(selectGroupName);
-
- selectGroup.setItemMeta(selectGroupMeta);
- this.groupSelection = new GuiItem(selectGroup, (event) -> {
+ this.groupSelection = new GuiItem(new ItemStack(Material.CHEST), (event) -> {
event.setCancelled(true);
GroupSelectSettingGui enchantGui = new GroupSelectSettingGui(
- selectGroupName,
+ CasedStringUtil.snakeToUpperSpacedCase(this.group.getName()) + " Groups",
this, this, 0);
enchantGui.show(event.getWhoClicked());
}, CustomAnvil.instance);
@@ -322,23 +310,23 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
// ----------------------------
// End of SelectGroupContainer related methods
// ----------------------------
- // SelectMaterialContainer related methods
+ // SelectGroupContainer related methods
// ----------------------------
@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,12 +342,12 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
}
@Override
- public Set illegalMaterials() {
- return Set.of(Material.AIR.getKey());
+ public EnumSet illegalMaterials() {
+ return EnumSet.of(Material.AIR);
}
// ----------------------------
- // End of SelectMaterialContainer related methods
+ // End of SelectGroupContainer related methods
// ----------------------------
private void updateDirectReferencingGroups(AbstractMaterialGroup referenceTo){
@@ -382,7 +370,7 @@ public class GroupConfigSubSettingGui extends MappedToListSubSettingGui implemen
for (AbstractMaterialGroup otherGroup : everyStoredGroups) {
if(otherGroup.getGroups().contains(testGroup)){
otherGroup.updateMaterials();
- updateFuture.add(otherGroup);
+ toUpdate.add(otherGroup);
}
}
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..363bd6a 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()) {
@@ -52,6 +48,7 @@ public class PluginSetDefault {
nbSet += trySetDefault(config, path + ALLOW_HEX_COLOR, DEFAULT_ALLOW_HEX_COLOR);
nbSet += trySetDefault(config, path + USE_COLOR_COST, DEFAULT_USE_COLOR_COST);
} else {
+ nbSet += trySetDefault(config, path + REMOVE_COLOR_ON_LORE_REMOVE, DEFAULT_REMOVE_COLOR_ON_LORE_REMOVE);
nbSet += trySetDefault(config, path + REMOVE_COLOR_COST, DEFAULT_REMOVE_COLOR_COST);
}
}
@@ -61,11 +58,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
deleted file mode 100644
index 660accb..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package xyz.alexcrea.cuanvil.update;
-
-import io.delilaheve.CustomAnvil;
-import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.update.minecraft.MCUpdate;
-import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21;
-import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21_11;
-import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21_9;
-import xyz.alexcrea.cuanvil.update.plugin.*;
-
-import javax.annotation.Nonnull;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Consumer;
-
-public class UpdateHandler {
-
- private static final String CONFIG_VERSION_PATH = "configVersion";
-
- // Handle mc version update then plugin version update
- public static void handleUpdates() {
- handleMCVersionUpdate();
- handlePluginUpdate();
- }
-
- private static final Map>> pUpdateMap = Map.of(
- new Version(1, 6, 2), PUpdate_1_6_2::handleUpdate,
- new Version(1, 6, 7), PUpdate_1_6_7::handleUpdate,
- new Version(1, 8, 0), PUpdate_1_8_0::handleUpdate,
- new Version(1, 11, 0), PUpdate_1_11_0::handleUpdate,
- new Version(1, 15, 5), PUpdate_1_15_5::handleUpdate,
- new Version(1, 15, 6), PUpdate_1_15_6::handleUpdate
- );
-
- private static final List mcUpdateMap = List.of(
- new Update_1_21(),
- new Update_1_21_9(),
- new Update_1_21_11()
- );
-
- // Handle only plugin update
- private static void handlePluginUpdate() {
- String versionString = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(CONFIG_VERSION_PATH);
- Version current = versionString == null ? new Version(0) : Version.fromString(versionString);
-
- Set toSave = new HashSet<>();
-
- AtomicReference latest = new AtomicReference<>(null);
-
- // Hopefully, should iterate in the "insertion" order
- pUpdateMap.forEach((ver, consumer) -> {
- if (ver.greaterThan(current)) {
- CustomAnvil.log("handling plugin update to " + ver);
- consumer.accept(toSave);
-
- latest.set(ver);
- }
- });
-
- if (latest.get() != null) {
- finishConfiguration(latest.get().toString(), toSave);
- }
- }
-
- // Handle minecraft version update (not plugin version update)
- public static void handleMCVersionUpdate() {
- Version current = UpdateUtils.currentMinecraftVersion();
-
- boolean hadUpdate = false;
- for (MCUpdate mcUpdate : mcUpdateMap) {
- hadUpdate |= mcUpdate.handleUpdate(current, hadUpdate);
- }
-
- 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) {
- CustomAnvil.instance.getLogger().info("Configuration file updated to " + newVersion);
- ConfigHolder.DEFAULT_CONFIG.getConfig().set(CONFIG_VERSION_PATH, newVersion);
-
- toSave.add(ConfigHolder.DEFAULT_CONFIG);
- // save
- for (ConfigHolder configHolder : toSave) {
- configHolder.saveToDisk(true);
- }
-
- // then reload
- for (ConfigHolder configHolder : toSave) {
- configHolder.reload();
- }
-
- }
-
-}
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/minecraft/Update_1_21.java b/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java
similarity index 64%
rename from src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21.java
rename to src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java
index 3aa6073..332b5fe 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/Update_1_21.java
@@ -1,24 +1,42 @@
-package xyz.alexcrea.cuanvil.update.minecraft;
+package xyz.alexcrea.cuanvil.update;
import io.delilaheve.CustomAnvil;
+import org.bukkit.configuration.file.FileConfiguration;
import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.update.UpdateUtils;
-import xyz.alexcrea.cuanvil.update.Version;
import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
-public class Update_1_21 extends MCUpdate {
+// This is a temporary class that aim to handle 1.21 update.
+// It will be replaced by a better system later.
+public class Update_1_21 {
+
+ private static final Version V1_21 = new Version(1, 21);
+
+ public static void handleUpdate(){
+ // Assume if version path is not null then it's 1.21
+ String oldVersion = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(UpdateUtils.MINECRAFT_VERSION_PATH);
+ if(oldVersion != null){
+ Version version = Version.fromString(oldVersion);
+
+ // Test 1.21
+ if(V1_21.greaterEqual(version)) return;
+ }
+ Version current = UpdateUtils.currentMinecraftVersion();
+
+ // Test 1.21
+ if(current.greaterEqual(V1_21)){
+ doUpdate();
+ }
- public Update_1_21() {
- super(new Version(1, 21));
}
- @Override
- protected void doUpdate() {
- var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
- var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
- var conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig();
- var unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
+ private static void doUpdate() {
+ CustomAnvil.instance.getLogger().info("Updating config to support 1.21 ...");
+
+ FileConfiguration baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
+ FileConfiguration groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
+ FileConfiguration conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig();
+ FileConfiguration unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
// Add mace to groups
groupConfig.set("mace.type", "include");
@@ -62,8 +80,8 @@ public class Update_1_21 extends MCUpdate {
// Add unit repair for mace
unitConfig.set("breeze_rod.mace", 0.25);
- // Set version string as current
- baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, version.toString());
+ // Set version string as 1.21
+ baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, "1.21");
// Save
ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
@@ -74,6 +92,9 @@ public class Update_1_21 extends MCUpdate {
// imply reload of CONFLICT_HOLDER
// We also do not need to reload base config as there is no object related to it.
ConfigHolder.ITEM_GROUP_HOLDER.reload();
+
+ CustomAnvil.instance.getLogger().info("Updating Done !");
+
}
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/Version.java b/src/main/java/xyz/alexcrea/cuanvil/update/Version.java
index a49fbdd..e6f63cf 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/update/Version.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/Version.java
@@ -1,7 +1,5 @@
package xyz.alexcrea.cuanvil.update;
-import org.jetbrains.annotations.NotNull;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -21,11 +19,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]);
}
@@ -54,7 +48,6 @@ public record Version(int major, int minor, int patch) {
this.patch <= other.patch)));
}
- @NotNull
@Override
public String toString() {
return major + "." + minor + "." + patch;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/MCUpdate.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/MCUpdate.java
deleted file mode 100644
index 40fc587..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/MCUpdate.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package xyz.alexcrea.cuanvil.update.minecraft;
-
-import io.delilaheve.CustomAnvil;
-import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.update.UpdateUtils;
-import xyz.alexcrea.cuanvil.update.Version;
-
-public abstract class MCUpdate {
-
- public final Version version;
-
- public MCUpdate(Version version){
- this.version = version;
- }
-
- public boolean handleUpdate(Version current, boolean hadUpdate){
- // Test if we are running in this update version or better
- if(version.greaterThan(current))
- return false;
-
- // if version path is not null then check if its it's before this update version
- String oldVersion = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(UpdateUtils.MINECRAFT_VERSION_PATH);
- if(oldVersion != null){
- var version = Version.fromString(oldVersion);
- if(this.version.lesserEqual(version)) return false;
- }
-
- if(!hadUpdate){
- CustomAnvil.instance.getLogger().info("Updating config to support minecraft " + current +" ...");
- }
- doUpdate();
- return true;
- }
-
- protected abstract void doUpdate();
-
-
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java
deleted file mode 100644
index d639596..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_11.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package xyz.alexcrea.cuanvil.update.minecraft;
-
-import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.update.UpdateUtils;
-import xyz.alexcrea.cuanvil.update.Version;
-
-import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
-
-public class Update_1_21_11 extends MCUpdate{
-
- public Update_1_21_11() {
- super(new Version(1, 21, 11));
- }
-
- @Override
- protected void doUpdate() {
- var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
- var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
- var conflictConfig = ConfigHolder.CONFLICT_HOLDER.getConfig();
- var unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
-
- // Create spear group
- groupConfig.set("spears.type", "include");
- addAbsentToList(groupConfig, "spears.items",
- "wooden_spear",
- "golden_spear",
- "stone_spear",
- "copper_spear",
- "iron_spear",
- "diamond_spear",
- "netherite_spear");
-
- // Add spear group to super group and enchantments
- addAbsentToList(groupConfig, "melee_weapons.groups", "spears");
-
- addAbsentToList(conflictConfig, "restriction_looting.notAffectedGroups", "spears");
- addAbsentToList(conflictConfig, "restriction_knockback.notAffectedGroups", "spears");
- addAbsentToList(conflictConfig, "restriction_fire_aspect.notAffectedGroups", "spears");
-
- // Unit repair for spears
- unitConfig.set("gold_ingot.golden_spear", 0.25);
- unitConfig.set("copper_ingot.copper_spear", 0.25);
- unitConfig.set("iron_ingot.iron_spear", 0.25);
- unitConfig.set("diamond.diamond_spear", 0.25);
- unitConfig.set("netherite_ingot.netherite_spear", 0.25);
-
- unitConfig.set("cobblestone.stone_spear", 0.25);
- unitConfig.set("cobbled_deepslate.stone_spear", 0.25);
-
- unitConfig.set("oak_planks.wooden_spear", 0.25);
- unitConfig.set("spruce_planks.wooden_spear", 0.25);
- unitConfig.set("birch_planks.wooden_spear", 0.25);
- unitConfig.set("jungle_planks.wooden_spear", 0.25);
- unitConfig.set("acacia_planks.wooden_spear", 0.25);
- unitConfig.set("dark_oak_planks.wooden_spear", 0.25);
- unitConfig.set("mangrove_planks.wooden_spear", 0.25);
- unitConfig.set("cherry_planks.wooden_spear", 0.25);
- unitConfig.set("bamboo_planks.wooden_spear", 0.25);
- unitConfig.set("crimson_planks.wooden_spear", 0.25);
- unitConfig.set("warped_planks.wooden_spear", 0.25);
-
- // Create lunge enchant value and group
- baseConfig.set("enchant_limits.minecraft:lunge", 3);
- baseConfig.set("enchant_values.minecraft:lunge.item", 2);
- baseConfig.set("enchant_values.minecraft:lunge.book", 1);
-
- addAbsentToList(conflictConfig, "restriction_lunge.enchantments", "minecraft:lunge");
- addAbsentToList(conflictConfig, "restriction_lunge.notAffectedGroups", "spears", "enchanted_book");
-
- // Set version string as current
- baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, version.toString());
-
- // Save
- ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
- ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true);
- ConfigHolder.CONFLICT_HOLDER.saveToDisk(true);
- ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true);
-
- // imply reload of CONFLICT_HOLDER
- // We also do not need to reload base config as there is no object related to it.
- ConfigHolder.ITEM_GROUP_HOLDER.reload();
- }
-
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java
deleted file mode 100644
index d289b9b..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_21_9.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package xyz.alexcrea.cuanvil.update.minecraft;
-
-import org.bukkit.configuration.file.FileConfiguration;
-import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.update.UpdateUtils;
-import xyz.alexcrea.cuanvil.update.Version;
-
-import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
-
-public class Update_1_21_9 extends MCUpdate{
-
- public Update_1_21_9() {
- super(new Version(1, 21, 9));
- }
-
- @Override
- protected void doUpdate() {
- var baseConfig = ConfigHolder.DEFAULT_CONFIG.getConfig();
- var groupConfig = ConfigHolder.ITEM_GROUP_HOLDER.getConfig();
- var unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
-
- // Add cooper items to groups
- addAbsentToList(groupConfig, "helmets.items", "copper_helmet");
- addAbsentToList(groupConfig, "chestplate.items", "copper_chestplate");
- addAbsentToList(groupConfig, "leggings.items", "copper_leggings");
- addAbsentToList(groupConfig, "boots.items", "copper_boots");
-
- addAbsentToList(groupConfig, "pickaxes.items", "copper_pickaxe");
- addAbsentToList(groupConfig, "shovels.items", "copper_shovel");
- addAbsentToList(groupConfig, "hoes.items", "copper_hoe");
- addAbsentToList(groupConfig, "axes.items", "copper_axe");
- addAbsentToList(groupConfig, "swords.items", "copper_sword");
-
- // Add unit repair
- addCopperUnitRepair(unitConfig);
-
- // Set version string as current
- baseConfig.set(UpdateUtils.MINECRAFT_VERSION_PATH, version.toString());
-
- // Save
- ConfigHolder.DEFAULT_CONFIG.saveToDisk(true);
- ConfigHolder.ITEM_GROUP_HOLDER.saveToDisk(true);
- ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(true);
-
- // imply reload of CONFLICT_HOLDER
- // We also do not need to reload base config as there is no object related to it.
- ConfigHolder.ITEM_GROUP_HOLDER.reload();
- }
-
- public static void addCopperUnitRepair(FileConfiguration unitConfig) {
- // Add unit repair
- unitConfig.set("copper_ingot.copper_helmet", 0.25);
- unitConfig.set("copper_ingot.copper_chestplate", 0.25);
- unitConfig.set("copper_ingot.copper_leggings", 0.25);
- unitConfig.set("copper_ingot.copper_boots", 0.25);
-
- unitConfig.set("copper_ingot.copper_pickaxe", 0.25);
- unitConfig.set("copper_ingot.copper_shovel", 0.25);
- unitConfig.set("copper_ingot.copper_hoe", 0.25);
- unitConfig.set("copper_ingot.copper_axe", 0.25);
- unitConfig.set("copper_ingot.copper_sword", 0.25);
- }
-
-}
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_15_5.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_15_5.java
deleted file mode 100644
index 76f51af..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_15_5.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.alexcrea.cuanvil.update.plugin;
-
-import org.bukkit.configuration.file.FileConfiguration;
-import xyz.alexcrea.cuanvil.config.ConfigHolder;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList;
-
-public class PUpdate_1_15_5 {
-
- public static void handleUpdate(@Nonnull Set toSave) {
- FileConfiguration config = ConfigHolder.CONFLICT_HOLDER.getConfig();
-
- if (config.isConfigurationSection("restriction_luck_of_the_sea")) return;
-
- // We fix the luck of the see enchantment
- addAbsentToList(config, "restriction_luck_of_the_sea.enchantments",
- "minecraft:luck_of_the_sea");
- addAbsentToList(config, "restriction_luck_of_the_sea.notAffectedGroups",
- "enchanted_book", "fishing_rod");
-
- toSave.add(ConfigHolder.CONFLICT_HOLDER);
- }
-
-}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_15_6.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_15_6.java
deleted file mode 100644
index fde7cfc..0000000
--- a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_15_6.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.alexcrea.cuanvil.update.plugin;
-
-import org.bukkit.configuration.file.FileConfiguration;
-import xyz.alexcrea.cuanvil.config.ConfigHolder;
-import xyz.alexcrea.cuanvil.update.UpdateUtils;
-import xyz.alexcrea.cuanvil.update.Version;
-import xyz.alexcrea.cuanvil.update.minecraft.Update_1_21_9;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-public class PUpdate_1_15_6 {
-
- public static void handleUpdate(@Nonnull Set toSave) {
- // fix only needed for 1.21.9 and above
- Version current = UpdateUtils.currentMinecraftVersion();
- if (new Version(1, 21, 9).greaterThan(current)) return;
-
- FileConfiguration unitConfig = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig();
-
- // Add unit repair
- Update_1_21_9.addCopperUnitRepair(unitConfig);
-
- toSave.add(ConfigHolder.UNIT_REPAIR_HOLDER);
- }
-
-}
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/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java
new file mode 100644
index 0000000..03c858e
--- /dev/null
+++ b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PluginUpdates.java
@@ -0,0 +1,52 @@
+package xyz.alexcrea.cuanvil.update.plugin;
+
+import io.delilaheve.CustomAnvil;
+import xyz.alexcrea.cuanvil.config.ConfigHolder;
+import xyz.alexcrea.cuanvil.update.Version;
+
+import javax.annotation.Nonnull;
+import java.util.HashSet;
+import java.util.Set;
+
+public class PluginUpdates {
+
+ private static final String CONFIG_VERSION_PATH = "configVersion";
+
+ public static void handlePluginUpdate() {
+ String versionString = ConfigHolder.DEFAULT_CONFIG.getConfig().getString(CONFIG_VERSION_PATH);
+ Version current = versionString == null ? new Version(0) : Version.fromString(versionString);
+
+ Set toSave = new HashSet<>();
+
+ if (new Version(1, 6, 2).greaterThan(current)) {
+ PUpdate_1_6_2.handleUpdate(toSave);
+ // We assume 1.6.7 will run. TODO a better system instead of that I guess
+ }
+ if (new Version(1, 6, 7).greaterThan(current)) {
+ PUpdate_1_6_7.handleUpdate(toSave);
+ // We assume 1.8.0 will run.
+ }
+ if (new Version(1, 8, 0).greaterThan(current)) {
+ PUpdate_1_8_0.handleUpdate(toSave);
+ // We assume 1.11.0 will run.
+ }
+
+ if (new Version(1, 11, 0).greaterThan(current)) {
+ PUpdate_1_11_0.handleUpdate(toSave);
+
+ finishConfiguration("1.11.0", toSave);
+ }
+
+ }
+
+ private static void finishConfiguration(@Nonnull String newVersion, @Nonnull Set toSave) {
+ CustomAnvil.instance.getLogger().info("Configuration file updated to " + newVersion);
+ ConfigHolder.DEFAULT_CONFIG.getConfig().set(CONFIG_VERSION_PATH, newVersion);
+
+ toSave.add(ConfigHolder.DEFAULT_CONFIG);
+ for (ConfigHolder configHolder : toSave) {
+ configHolder.saveToDisk(true);
+ }
+ }
+
+}
diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt
index 4d99faf..442af0a 100644
--- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt
+++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt
@@ -6,14 +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
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant
@@ -21,10 +17,10 @@ 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.update.Update_1_21
+import xyz.alexcrea.cuanvil.update.plugin.PluginUpdates
+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,18 +46,14 @@ 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"
- // Config command name
- const val commandConfigName = "customanvilconfig"
+ // Test command name
+ const val commandTestName = "customanvilconfig"
// Current plugin instance
lateinit var instance: CustomAnvil
@@ -69,12 +61,10 @@ open class CustomAnvil : JavaPlugin() {
// Chat message listener
lateinit var chatListener: ChatEventListener
- var latestVer: String? = null
-
/**
* Logging handler
*/
- @JvmStatic fun log(message: String) {
+ fun log(message: String) {
if (ConfigOptions.debugLog) {
instance.logger.info(message)
}
@@ -89,26 +79,7 @@ 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
}
/**
@@ -116,74 +87,7 @@ open class CustomAnvil : JavaPlugin() {
*/
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 +96,33 @@ open class CustomAnvil : JavaPlugin() {
logger.warning("Please note CustomAnvil is a more recent version of UnsafeEnchantsPlus")
}
- val isPaper = PlatformUtil.isPaper
- if(!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")
- }
- }
+ // Add commands
+ prepareCommand()
- val loader = if(isPaper) "paper" else "spigot"
-
- 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,13 +135,15 @@ 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
}
- // Handle minecraft and plugin updates
- UpdateHandler.handleUpdates()
+ // temporary: handle 1.21 update
+ Update_1_21.handleUpdate()
+
+ // plugin configuration updates
+ PluginUpdates.handlePluginUpdate()
// Register enchantment of compatible plugin and load configuration change.
DependencyManager.handleCompatibilityConfig()
@@ -260,11 +156,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(
@@ -314,10 +208,8 @@ open class CustomAnvil : JavaPlugin() {
var command = getCommand(commandReloadName)
command?.setExecutor(ReloadExecutor())
- command = getCommand(commandConfigName)
+ command = getCommand(commandTestName)
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..980999f 100644
--- a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt
+++ b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt
@@ -3,16 +3,11 @@ package io.delilaheve.util
import io.delilaheve.CustomAnvil
import io.delilaheve.util.EnchantmentUtil.enchantmentName
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 +19,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"
@@ -39,17 +31,13 @@ object ConfigOptions {
const val ITEM_RENAME_COST = "item_rename_cost"
const val SACRIFICE_ILLEGAL_COST = "sacrifice_illegal_enchant_cost"
- const val ADD_BOOK_ENCHANTMENT_AS_STORED_ENCHANTMENT = "add_book_enchantment_as_stored_enchantment"
// Color related config
const val ALLOW_COLOR_CODE = "allow_color_code"
const val ALLOW_HEXADECIMAL_COLOR = "allow_hexadecimal_color"
- const val ALLOW_MINIMESSAGE = "allow_minimessage"
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"
@@ -57,31 +45,15 @@ object ConfigOptions {
const val EXCLUSIVE_WORK_PENALTY_INCREASE = "exclusive_increase"
const val EXCLUSIVE_WORK_PENALTY_ADDITIVE = "exclusive_additive"
- // Enchant limit config
- const val ENCHANT_COUNT_LIMIT_ROOT = "enchantment_count_limit"
- 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"
private const val KEY_ITEM = "item"
@@ -106,34 +78,19 @@ object ConfigOptions {
const val DEFAULT_ITEM_RENAME_COST = 1
const val DEFAULT_SACRIFICE_ILLEGAL_COST = 1
- const val DEFAULT_ADD_BOOK_ENCHANTMENT_AS_STORED_ENCHANTMENT = false
-
- const val DEFAULT_ENCHANT_COUNT_LIMIT = -1
// Color related config
const val DEFAULT_ALLOW_COLOR_CODE = false
const val DEFAULT_ALLOW_HEXADECIMAL_COLOR = false
- const val DEFAULT_ALLOW_MINIMESSAGE = false
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,15 +115,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
-
- // Valid range for an enchantment count limit
@JvmField
- val ENCHANT_COUNT_LIMIT_RANGE = -1..255
+ val ENCHANT_LIMIT_RANGE = 1..255
// --------------
// Other defaults
@@ -178,11 +129,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
// -------------
@@ -277,16 +223,6 @@ object ConfigOptions {
?: DEFAULT_SACRIFICE_ILLEGAL_COST
}
- /**
- * Consider book enchantment as book stored enchantment
- */
- val addBookEnchantmentAsStoredEnchantment : Boolean
- get(){
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(ADD_BOOK_ENCHANTMENT_AS_STORED_ENCHANTMENT, DEFAULT_ADD_BOOK_ENCHANTMENT_AS_STORED_ENCHANTMENT)
- }
-
/**
* Allow usage of color code
*/
@@ -307,22 +243,12 @@ object ConfigOptions {
.getBoolean(ALLOW_HEXADECIMAL_COLOR, DEFAULT_ALLOW_HEXADECIMAL_COLOR)
}
- /**
- * Allow usage of minimessage formating
- */
- val allowMinimessage: Boolean
- get() {
- return ConfigHolder.DEFAULT_CONFIG
- .config
- .getBoolean(ALLOW_MINIMESSAGE, DEFAULT_ALLOW_MINIMESSAGE)
- }
-
/**
* If one of the color component is enabled
*/
val renameColorPossible: Boolean
get() {
- return allowColorCode || allowHexadecimalColor || allowMinimessage
+ return allowColorCode || allowHexadecimalColor
}
/**
@@ -335,16 +261,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
*/
@@ -392,43 +308,13 @@ object ConfigOptions {
}
/**
- * Get material enchantment count limit
- *
- * @return the current enchantment limit. -1 if none
+ * Default enchantment limit
*/
- fun getEnchantCountLimit(type: NamespacedKey): Int? {
- val limit = materialEnchantCountLimit(type)
-
- if(limit != null) return limit
- if(defaultEnchantCountLimit >= 0) return defaultEnchantCountLimit
-
- return DependencyManager.ecoEnchantCompatibility?.getEcoLevelLimit()
- }
-
- /**
- * Get the material enchantment count limit.
- *
- * @return The current enchantment limit. -1 if none
- */
- private fun materialEnchantCountLimit(type: NamespacedKey): Int? {
- val path = "$ENCHANT_COUNT_LIMIT_ITEMS.${type.key.lowercase()}"
- if(!ConfigHolder.DEFAULT_CONFIG.config.isInt(path))
- return null
-
- return ConfigHolder.DEFAULT_CONFIG.config
- .getInt(path)
- .takeIf { it in ENCHANT_COUNT_LIMIT_RANGE }
- }
- /**
- * User configured default enchantment count limit
- */
- val defaultEnchantCountLimit: Int
+ private val defaultEnchantLimit: Int
get() {
return ConfigHolder.DEFAULT_CONFIG
.config
- .getInt(ENCHANT_COUNT_LIMIT_DEFAULT, DEFAULT_ENCHANT_COUNT_LIMIT)
- .takeIf { it in ENCHANT_COUNT_LIMIT_RANGE }
- ?: DEFAULT_ENCHANT_COUNT_LIMIT
+ .getInt(DEFAULT_LIMIT_PATH, DEFAULT_ENCHANT_LIMIT)
}
/**
@@ -451,90 +337,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 +448,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 +471,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 +494,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..87e4bae 100644
--- a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt
+++ b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt
@@ -6,7 +6,6 @@ import org.bukkit.inventory.ItemStack
import xyz.alexcrea.cuanvil.config.ConfigHolder
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 +30,81 @@ 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)
- if(maxEnchantCount == null || maxEnchantCount < 0) maxEnchantCount = Int.MAX_VALUE
+ other.forEach { (enchantment, level) ->
+ if(!enchantment.isAllowed(player)) return@forEach
- val allowed = other.filter { (enchantment, _) -> enchantment.isAllowed(player) }
- val new = allowed.filter{ (enchantment, _) -> !containsKey(enchantment)}
- val old = allowed.filter{ (enchantment, _) -> containsKey(enchantment)}
-
- 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)) {
+ // 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..85761d9 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EditConfigExecutor.kt
@@ -2,25 +2,21 @@ 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.dependency.DependencyManager
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
}
- if(PlatformUtil.isFolia){
+ if(DependencyManager.isFolia){
sender.sendMessage("§cIt look like you are using Folia. Sadly Custom Anvil do not support Config gui for Folia.")
sender.sendMessage("§eIt is may come in a future version.")
sender.sendMessage("")
@@ -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..38a98c0 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt
@@ -9,15 +9,11 @@ import xyz.alexcrea.cuanvil.api.event.CAConfigReadyEvent
import xyz.alexcrea.cuanvil.config.ConfigHolder
import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.gui.config.global.*
-import xyz.alexcrea.cuanvil.update.UpdateHandler
+import xyz.alexcrea.cuanvil.update.Update_1_21
-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
*/
@@ -60,8 +48,8 @@ class ReloadExecutor : CASubCommand() {
UnitRepairConfigGui.getCurrentInstance()?.reloadValues()
CustomRecipeConfigGui.getCurrentInstance()?.reloadValues()
- // handle minecraft version update
- UpdateHandler.handleMCVersionUpdate()
+ // temporary: handle 1.21 update
+ Update_1_21.handleUpdate()
// Handle dependency reload
DependencyManager.handleConfigReload()
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt
index b730a0e..bbe2ca3 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt
@@ -1,45 +1,33 @@
package xyz.alexcrea.cuanvil.dependency
-import com.maddoxh.superEnchants.SuperEnchants
import io.delilaheve.CustomAnvil
-import net.kyori.adventure.text.Component
+import io.delilaheve.util.ConfigOptions
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.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.*
import xyz.alexcrea.cuanvil.dependency.scheduler.BukkitScheduler
import xyz.alexcrea.cuanvil.dependency.scheduler.FoliaScheduler
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 java.util.logging.Level
object DependencyManager {
+ var isFolia: Boolean = false
lateinit var scheduler: TaskScheduler
lateinit var packetManager: PacketManager
- var externGuiTester: GenericExternGuiTester = GenericExternGuiTester()
+ var externGuiTester: ExternGuiTester? = null
var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null
var ecoEnchantCompatibility: EcoEnchantDependency? = null
@@ -48,17 +36,14 @@ object DependencyManager {
var disenchantmentCompatibility: DisenchantmentDependency? = null
var havenBagsCompatibility: HavenBagsDependency? = null
- var axPlayerWarpsCompatibility: AxPlayerWarpsDependency? = null
-
- var itemsAdderCompatibility: ItemsAdderDependency? = null
-
val genericDependencies = ArrayList()
fun loadDependency() {
val pluginManager = Bukkit.getPluginManager()
// Bukkit or Paper scheduler ?
- scheduler = if (PlatformUtil.isFolia) {
+ isFolia = testIsFolia()
+ scheduler = if (isFolia) {
CustomAnvil.instance.logger.info("Folia detected... Custom Anvil Folia support is experimental. issues are more likely to happens.")
FoliaScheduler()
@@ -67,6 +52,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")) {
@@ -98,28 +84,15 @@ object DependencyManager {
havenBagsCompatibility!!.redirectListeners()
}
- // AxPlayerWarps dependency
- if (pluginManager.isPluginEnabled("AxPlayerWarps")) {
- 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")!!))
- 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)
+ if(ConfigOptions.verboseDebugLog){
+ CustomAnvil.verboseLog("Number of generics comp: " + genericDependencies.size)
+ for (dependency in genericDependencies) {
+ CustomAnvil.verboseLog("- " + dependency.plugin)
+ }
}
for (dependency in genericDependencies)
@@ -149,74 +122,67 @@ 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
}
}
private fun earlyUnsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
- // Run the event
- val bypassEvent = CAEarlyPreAnvilBypassEvent(event)
- Bukkit.getPluginManager().callEvent(bypassEvent)
-
- var bypass = bypassEvent.isCancelled
+ var bypass = false
// Test if the inventory is a gui(version specific)
- if (!bypass && externGuiTester.testIfGui(event.view)) bypass = true
-
- // Test if in an ax player warp rating gui
- if (!bypass && (axPlayerWarpsCompatibility?.testIfGui(player) == true)) bypass = true
+ if (externGuiTester?.testIfGui(event.view) == true) bypass = true
return bypass
}
// 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 {
- // Run the event
- val bypassEvent = CAPreAnvilBypassEvent(event)
- Bukkit.getPluginManager().callEvent(bypassEvent)
-
- var bypass = bypassEvent.isCancelled
+ private fun unsafeTryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
+ var bypass = false
// Test if disenchantment used prepare anvil
- if (!bypass && (disenchantmentCompatibility?.testPrepareAnvil(event, player) == true)) bypass = true
+ if (disenchantmentCompatibility?.testPrepareAnvil(event, player) == true) bypass = true
// Test heaven bags used prepare anvil
if (!bypass && (havenBagsCompatibility?.testPrepareAnvil(event, player) == true)) bypass = true
@@ -231,29 +197,32 @@ object DependencyManager {
return bypass
}
- // Return null if there was an issue
- fun tryTreatAnvilResult(
- view: InventoryView,
- inventory: Inventory, // TODO REMOVE, use view instead on legacy removal
- player: HumanEntity,
- result: ItemStack,
- useType: AnvilUseType,
- cost: AnvilCost
- ): ItemStack? {
- val treatEvent = CATreatAnvilResult2Event(view, inventory, useType, result, cost)
+ // Return true only if error occurred (and so should bypass rest)
+ fun tryTreatAnvilResult(event: PrepareAnvilEvent, result: ItemStack): Boolean {
try {
- unsafeTryTreatAnvilResult(treatEvent)
- return treatEvent.result
+ unsafeTryTreatAnvilResult(event, result)
+ return false
} catch (e: Exception) {
- logExceptionAndClear(player, inventory, e)
- return null
+ 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 unsafeTryTreatAnvilResult(event: CATreatAnvilResult2Event) {
- Bukkit.getPluginManager().callEvent(event)
-
- excellentEnchantsCompatibility?.treatAnvilResult(event)
+ private fun unsafeTryTreatAnvilResult(event: PrepareAnvilEvent, result: ItemStack) {
+ excellentEnchantsCompatibility?.treatAnvilResult(event, result)
}
// Return true if should bypass (either by a dependency or error)
@@ -261,20 +230,29 @@ 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
}
}
private fun unsafeTryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
- // Run the event
- val bypassEvent = CAClickResultBypassEvent(event)
- Bukkit.getPluginManager().callEvent(bypassEvent)
-
- var bypass = bypassEvent.isCancelled
+ var bypass = false
// Test if disenchantment used event click
- if (!bypass && (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true
+ if (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true) bypass = true
// Test if haven bag used event click
if (!bypass && (havenBagsCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true
@@ -287,40 +265,20 @@ object DependencyManager {
}
// Test if the inventory is a gui(version specific)
- if (!bypass && externGuiTester.testIfGui(event.view)) bypass = true
-
- // Test if in an ax player warp rating gui
- if (!bypass && (axPlayerWarpsCompatibility?.testIfGui(event.view.player) == true)) bypass = true
+ if (!bypass && (externGuiTester?.testIfGui(event.view) == 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 {
+ fun stripLore(item: ItemStack): ArrayList {
+ val lore = ArrayList()
val dummy = item.clone()
enchantmentSquaredCompatibility?.stripLore(dummy)
- val itemLore = dummy.itemMeta?.componentLore() ?: return ArrayList()
+ val itemLore = dummy.itemMeta!!.lore
+ if (itemLore != null) lore.addAll(itemLore)
- val lore = ArrayList()
- lore.addAll(itemLore)
return lore
}
@@ -328,4 +286,13 @@ object DependencyManager {
enchantmentSquaredCompatibility?.updateLore(item)
}
+ private fun testIsFolia(): Boolean {
+ try {
+ Class.forName("io.papermc.paper.threadedregions.RegionizedServer")
+ return true
+ } catch (e: ClassNotFoundException) {
+ return false
+ }
+ }
+
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt
deleted file mode 100644
index cbd2209..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency
-
-import xyz.alexcrea.cuanvil.update.UpdateUtils
-
-object MinecraftVersionUtil {
-
- val craftbukkitVersion: String?
- get() {
- val version = UpdateUtils.currentMinecraftVersion()
- if (version.major != 1) return null
-
- return when (version.minor) {
- 17 -> when (version.patch) {
- 0, 1 -> "1_17R1"
- else -> null
- }
-
- 18 -> when (version.patch) {
- 0, 1 -> "1_18R1"
- 2 -> "1_18R2"
- else -> null
- }
-
- 19 -> when (version.patch) {
- 0, 1, 2 -> "1_19R1"
- 3 -> "1_19R2"
- 4 -> "1_19R3"
- else -> null
- }
-
- 20 -> when (version.patch) {
- 0, 1 -> "1_20R1"
- 2 -> "1_20R2"
- 3, 4 -> "1_20R3"
- 5, 6 -> "1_20R4"
- else -> null
- }
-
- 21 -> when (version.patch) {
- 0, 1 -> "1_21R1"
- 2, 3 -> "1_21R2"
- 4 -> "1_21R3"
- 5 -> "1_21R4"
- 6, 7, 8 -> "1_21R5"
- 9, 10 -> "1_21R6"
- 11 -> "1_21R7"
- else -> null
- }
-
- else -> null
- }
- }
-
- 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..59b5649 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt
@@ -17,15 +17,13 @@ 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
*/
private val LASTEST_VERSION = mapOf(
- Pair("bracken", Version(1, 11, 0)),
- Pair("enchantplus", Version(1, 13, 0)),
- Pair("dungeons_and_taverns", Version(1, 13, 0))
+ Pair("bracken", Version(1, 11, 0))
)
val enabledDatapacks: List
@@ -49,16 +47,6 @@ object DataPackDependency {
continue
}
- if (packName.contains("neoenchant", ignoreCase = true)) {
- handlePack("enchantplus")
- continue
- }
-
- if (packName.contains("Dungeons and Taverns", ignoreCase = true)) {
- handlePack("dungeons_and_taverns")
- continue
- }
-
}
}
@@ -72,12 +60,9 @@ object DataPackDependency {
private fun handlePackInitialConfig(pack: String) {
val defConfig = ConfigHolder.DEFAULT_CONFIG
val version = LASTEST_VERSION[pack]
- if(version == null) {
- throw RuntimeException("The pack $pack has no latest version hard coded in the plugin")
- }
val currentVersion = Version.fromString(defConfig.config.getString("datapack.$pack"))
- if (currentVersion.greaterEqual(version)) {
+ if (currentVersion.greaterEqual(version!!)) {
handleEnchantAllConflict(pack)
return
}
@@ -145,7 +130,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
deleted file mode 100644
index 4046f4a..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt
+++ /dev/null
@@ -1,111 +0,0 @@
-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 {
-
- 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
- var inTesting = false
-
- var testedClass: String? = null
- lateinit var getHandleMethod: Method
-
- private fun getContainerClass(view: InventoryView): Class? {
- if(!testedClass.contentEquals(view.javaClass.name))
- return null
-
- val container = getHandleMethod.invoke(view)
- return container.javaClass
- }
-
- fun tryFromClass(className: String) {
- val clazz = Class.forName(className)
- testedClass = className
-
- getHandleMethod = clazz.getMethod(HANDLE_METHOD_NAME)
- }
-
- fun isInTest(): Boolean {
- if(!testExist) testClassExist()
- return inTesting
- }
-
- fun testClassExist() {
- testExist = true
-
- // We first try to get craft anvil interface,
- // but is absent on old version so we try craft inventory view before
- try {
- tryFromClass(ANVIL_CLASS_NAME)
- return
- }
- catch (_: ClassNotFoundException) {}
- catch (_: NoSuchMethodException) {}
-
- try {
- tryFromClass(INV_CLASS_NAME)
- return
- }
- catch (_: ClassNotFoundException) {}
- catch (_: NoSuchMethodException) {}
-
- 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..8c6ad26
--- /dev/null
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt
@@ -0,0 +1,54 @@
+package xyz.alexcrea.cuanvil.dependency.gui
+
+import xyz.alexcrea.cuanvil.dependency.gui.version.*;
+import xyz.alexcrea.cuanvil.update.UpdateUtils
+
+object GuiTesterSelector {
+
+ val selectGuiTester: ExternGuiTester?
+ get() {
+ val versionParts = UpdateUtils.currentMinecraftVersionArray()
+ if (versionParts[0] != 1) return null
+
+ return when (versionParts[1]) {
+ // Can't support 1.16.5 bc 1.16.5 paper userdev do not exist
+
+ 17 -> when (versionParts[2]) {
+ 0, 1 -> v1_17R1_ExternGuiTester()
+ else -> null
+ }
+
+ 18 -> when (versionParts[2]) {
+ 0, 1 -> v1_18R1_ExternGuiTester()
+ 2 -> v1_18R2_ExternGuiTester()
+ else -> null
+ }
+
+ 19 -> when (versionParts[2]) {
+ 0, 1, 2 -> v1_19R1_ExternGuiTester()
+ 3 -> v1_19R2_ExternGuiTester()
+ 4 -> v1_19R3_ExternGuiTester()
+ else -> null
+ }
+
+ 20 -> when (versionParts[2]) {
+ 0, 1 -> v1_20R1_ExternGuiTester()
+ 2 -> v1_20R2_ExternGuiTester()
+ 3, 4 -> v1_20R3_ExternGuiTester()
+ 5, 6 -> v1_20R4_ExternGuiTester()
+ else -> null
+ }
+
+ 21 -> when (versionParts[2]) {
+ 0, 1 -> v1_21R1_ExternGuiTester()
+ 2, 3 -> v1_21R2_ExternGuiTester()
+ 4 -> v1_21R3_ExternGuiTester()
+ 5 -> v1_21R4_ExternGuiTester()
+ else -> null
+ }
+
+ else -> null
+ }
+ }
+
+}
\ 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..fc14921 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,16 @@
package xyz.alexcrea.cuanvil.dependency.packet
import org.bukkit.Bukkit
-import xyz.alexcrea.cuanvil.dependency.DependencyManager
-import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil
import xyz.alexcrea.cuanvil.dependency.packet.versions.*
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
+ versionSpecificManager ?: protocolibIfPresent
}
private val protocolibIfPresent: PacketManager
@@ -34,21 +19,49 @@ object PacketManagerSelector {
ProtocoLibWrapper()
else
NoPacketManager()
-
- // Reobfuscated packet manager for spigot or paper as it remap
- private val reobfPacketManager: PacketManagerBase?
+ private val versionSpecificManager: 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." +
- "V${MinecraftVersionUtil.craftbukkitVersion}_PacketManager")
+ return when (versionParts[1]) {
+ // Can't support 1.16.5 bc 1.16.5 paper userdev do not exist
- val manager = clazz.getConstructor().newInstance()
- return manager as PacketManagerBase
- } catch (_: ClassNotFoundException) {
- return null
+ 17 -> when (versionParts[2]) {
+ 0, 1 -> V1_17R1_PacketManager()
+ else -> null
+ }
+
+ 18 -> when (versionParts[2]) {
+ 0, 1 -> V1_18R1_PacketManager()
+ 2 -> V1_18R2_PacketManager()
+ else -> null
+ }
+
+ 19 -> when (versionParts[2]) {
+ 0, 1, 2 -> V1_19R1_PacketManager()
+ 3 -> V1_19R2_PacketManager()
+ 4 -> V1_19R3_PacketManager()
+ else -> null
+ }
+
+ 20 -> when (versionParts[2]) {
+ 0, 1 -> V1_20R1_PacketManager()
+ 2 -> V1_20R2_PacketManager()
+ 3, 4 -> V1_20R3_PacketManager()
+ 5, 6 -> V1_20R4_PacketManager()
+ else -> null
+ }
+
+ 21 -> when (versionParts[2]) {
+ 0, 1 -> V1_21R1_PacketManager()
+ 2, 3 -> V1_21R2_PacketManager()
+ 4 -> V1_21R3_PacketManager()
+ 5 -> V1_21R4_PacketManager()
+ else -> null
+ }
+
+ else -> null
}
}
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/AxPlayerWarpsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/AxPlayerWarpsDependency.kt
deleted file mode 100644
index e0ca218..0000000
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/AxPlayerWarpsDependency.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.alexcrea.cuanvil.dependency.plugins
-
-import com.artillexstudios.axplayerwarps.libs.axapi.gui.AnvilInput
-import org.bukkit.entity.HumanEntity
-import org.bukkit.entity.Player
-
-class AxPlayerWarpsDependency {
-
- fun testIfGui(player: HumanEntity): Boolean {
- return player is Player && AnvilInput.get(player) != null
- }
-
-}
\ No newline at end of file
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..acccabe 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt
@@ -5,21 +5,14 @@ import com.jankominek.disenchantment.events.DisenchantClickEvent
import com.jankominek.disenchantment.events.DisenchantEvent
import com.jankominek.disenchantment.events.ShatterClickEvent
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.event.Listener
+import org.bukkit.entity.HumanEntity
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 java.util.logging.Level
-import kotlin.reflect.KClass
+import xyz.alexcrea.cuanvil.util.AnvilXpUtil
class DisenchantmentDependency {
@@ -29,44 +22,25 @@ class DisenchantmentDependency {
fun redirectListeners() {
PrepareAnvilEvent.getHandlerList().unregister(Disenchantment.plugin)
-
- // unregister only the feature click event and not all
- // This is to avoid the disenchantment gui breaking
- try {
- unregisterStaticDisenchantmentListener(ShatterClickListener::class)
- unregisterStaticDisenchantmentListener(DisenchantClickListener::class)
- } catch (e: Exception) {
- CustomAnvil.instance.logger.log(
- Level.SEVERE, "Could not initialize disenchantment support" +
- "please report this bug to the developer", e
- )
- trackError(e)
- }
+ InventoryClickEvent.getHandlerList().unregister(Disenchantment.plugin)
}
- private fun unregisterStaticDisenchantmentListener(clazz: KClass<*>) {
- val field = clazz.java.getDeclaredField("listener")
- field.isAccessible = true
- val listener: Listener = field.get(null) as Listener
- 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
// Test if event change the result
DisenchantEvent.onEvent(event)
- if (event.result != null) {
+ 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) {
+ 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
}
@@ -79,13 +53,13 @@ class DisenchantmentDependency {
// Test event if change the result
DisenchantClickEvent.onEvent(event)
- if (!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
+ if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
CustomAnvil.log("Detected anvil click item extract bypass.")
return true
}
ShatterClickEvent.onEvent(event)
- if (!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
+ if(!testAnvilInventoryChange(inventory, previousResultSlot) || event.isCancelled) {
CustomAnvil.log("Detected anvil click split enchant bypass.")
return true
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoEnchantDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoEnchantDependency.kt
index 079d570..22fce5e 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoEnchantDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EcoEnchantDependency.kt
@@ -1,9 +1,7 @@
package xyz.alexcrea.cuanvil.dependency.plugins
-import com.willfp.eco.core.EcoPlugin
import com.willfp.ecoenchants.enchant.EcoEnchant
import com.willfp.ecoenchants.enchant.EcoEnchants
-import com.willfp.ecoenchants.mechanics.infiniteIfNegative
import io.delilaheve.CustomAnvil
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.plugin.Plugin
@@ -34,10 +32,6 @@ class EcoEnchantDependency(private val ecoEnchantPlugin: Plugin) {
}
- public fun getEcoLevelLimit(): Int {
- return (ecoEnchantPlugin as EcoPlugin).configYml.getInt("anvil.enchant-limit").infiniteIfNegative()
- }
-
fun disableAnvilListener() {
PrepareAnvilEvent.getHandlerList().unregister(this.ecoEnchantPlugin)
}
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..e5aa8be 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt
@@ -7,158 +7,80 @@ import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.RegisteredListener
+import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant
+import su.nightexpress.excellentenchants.enchantment.listener.AnvilListener
+import su.nightexpress.excellentenchants.enchantment.listener.EnchantAnvilListener
+import su.nightexpress.excellentenchants.registry.EnchantRegistry
import xyz.alexcrea.cuanvil.api.EnchantmentApi
-import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResult2Event
-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.CAEEEnchantment
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
-import su.nightexpress.excellentenchants.manager.listener.AnvilListener as V5AnvilListener
-import su.nightexpress.excellentenchants.enchantment.listener.AnvilListener as PreV5AnvilListener
-import su.nightexpress.excellentenchants.enchantment.listener.EnchantAnvilListener as LegacyAnvilListener
-import su.nightexpress.excellentenchants.enchantment.registry.EnchantRegistry as LegacyEnchantRegistry
-import su.nightexpress.excellentenchants.registry.EnchantRegistry as PreV5EnchantRegistry
-// I don't like that I need to support older version. if I could just drop older support it would be sooo nice
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"),
- LEGACY("su.nightexpress.excellentenchants.enchantment.listener.EnchantAnvilListener"),
- }
-
- private val listenerVersion: ListenerVersion?
- private val isModernCurseOfFragility: Boolean
+ private val isModern: Boolean
init {
CustomAnvil.instance.logger.info("Excellent Enchants Detected !")
- var listenerVersion: ListenerVersion? = null
- for (value in ListenerVersion.entries) {
- try {
- Class.forName(value.classPath)
-
- listenerVersion = value
- break
- } catch (ignored: ClassNotFoundException) {
- }
- }
-
- if (listenerVersion == null) {
- CustomAnvil.instance.logger.severe("Found issue with listener of Excellent Enchants. compatiblity is broken. please contact CustomAnvil devs")
- } else{
- CustomAnvil.log("Support version: " + listenerVersion.name)
- }
-
- var isModernCurseOfFragility = true
+ var isModern = true;
try {
- Class.forName("su.nightexpress.excellentenchants.enchantment.universal.CurseOfFragilityEnchant")
+ Class.forName("su.nightexpress.excellentenchants.enchantment.listener.AnvilListener")
} catch (ignored: ClassNotFoundException) {
- isModernCurseOfFragility = false
+ isModern = false
}
- this.listenerVersion = listenerVersion
- this.isModernCurseOfFragility = isModernCurseOfFragility
+ this.isModern = isModern
}
fun registerEnchantments() {
CustomAnvil.instance.logger.info("Preparing Excellent Enchants compatibility...")
// 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 -> {
- for (enchantment in ExcellentEnchant5_3Registry.getRegistered()) {
- EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
- EnchantmentApi.registerEnchantment(CAEEV5_4Enchantment(enchantment))
- }
+ if (this.isModern) {
+ for (enchantment in EnchantRegistry.getRegistered()) {
+ EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
+ EnchantmentApi.registerEnchantment(CAEEEnchantment(enchantment))
}
-
- ListenerVersion.V5, ListenerVersion.V5_3 -> {
- for (enchantment in V5EnchantRegistry.getRegistered()) {
- EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
- EnchantmentApi.registerEnchantment(CAEEV5Enchantment(enchantment))
- }
+ } else {
+ for (enchantment in su.nightexpress.excellentenchants.enchantment.registry.EnchantRegistry.getRegistered()) {
+ EnchantmentApi.unregisterEnchantment(enchantment.enchantment.key)
+ EnchantmentApi.registerEnchantment(CALegacyEEEnchantment(enchantment))
}
-
- ListenerVersion.PRE_V5 -> {
- for (enchantment in PreV5EnchantRegistry.getRegistered()) {
- EnchantmentApi.unregisterEnchantment(enchantment.bukkitEnchantment.key)
- EnchantmentApi.registerEnchantment(CAEEPreV5Enchantment(enchantment))
- }
- }
-
- ListenerVersion.LEGACY -> {
- for (enchantment in LegacyEnchantRegistry.getRegistered()) {
- EnchantmentApi.unregisterEnchantment(enchantment.enchantment.key)
- EnchantmentApi.registerEnchantment(CALegacyEEEnchantment(enchantment))
- }
- }
-
- null -> return
-
}
CustomAnvil.instance.logger.info("Excellent Enchants should now work as expected !")
}
- private var legacyFragilityCurse: LegacyCurseOfFragilityEnchant? = null
+ private var fragilityCurse: CurseOfFragilityEnchant? = null
- private var v5AnvilListener: V5AnvilListener? = null
- private var preV5AnvilListener: PreV5AnvilListener? = null
- private var legacyAnvilListener: LegacyAnvilListener? = null
+ private var modernAnvilListener: AnvilListener? = null
+ private var legacyAnvilListener: EnchantAnvilListener? = null
private lateinit var usedAnvilListener: Listener
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
for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) {
val listener = registeredListener.listener
- if (!isModernCurseOfFragility) {
- if (listener is LegacyCurseOfFragilityEnchant) {
- this.legacyFragilityCurse = listener
- toUnregister.add(registeredListener)
- }
+ if (listener is CurseOfFragilityEnchant) {
+ this.fragilityCurse = listener
+ toUnregister.add(registeredListener)
}
- when (listenerVersion) {
- ListenerVersion.V5,
- ListenerVersion.V5_3,
- ListenerVersion.V5_4,
- -> {
- if (listener is V5AnvilListener) {
- this.v5AnvilListener = listener
- toUnregister.add(registeredListener)
- }
+ if (this.isModern) {
+ if (listener is AnvilListener) {
+ this.modernAnvilListener = listener;
+ toUnregister.add(registeredListener)
}
-
- ListenerVersion.PRE_V5 -> {
- if (listener is PreV5AnvilListener) {
- this.preV5AnvilListener = listener
- toUnregister.add(registeredListener)
- }
- }
-
- ListenerVersion.LEGACY -> {
- if (listener is LegacyAnvilListener) {
- this.legacyAnvilListener = listener
- toUnregister.add(registeredListener)
- }
- }
-
- null -> {
+ } else {
+ if (listener is EnchantAnvilListener) {
+ this.legacyAnvilListener = listener;
+ toUnregister.add(registeredListener)
}
}
@@ -168,14 +90,10 @@ class ExcellentEnchantsDependency {
PrepareAnvilEvent.getHandlerList().unregister(listener)
}
- when (listenerVersion) {
- ListenerVersion.V5_3,
- ListenerVersion.V5,
- ListenerVersion.V5_4,
- -> this.usedAnvilListener = v5AnvilListener!!
- ListenerVersion.PRE_V5 -> this.usedAnvilListener = preV5AnvilListener!!
- ListenerVersion.LEGACY -> this.usedAnvilListener = legacyAnvilListener!!
- null -> {}
+ if (this.isModern) {
+ this.usedAnvilListener = this.modernAnvilListener!!
+ } else {
+ this.usedAnvilListener = this.legacyAnvilListener!!
}
// Unregister inventory click event
@@ -191,27 +109,17 @@ 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)
}
fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean {
if (event.result != null) {
- if (!isModernCurseOfFragility) {
- this.legacyFragilityCurse?.onItemAnvil(event)
- }
+ this.fragilityCurse?.onItemAnvil(event)
if (event.result == null) return true
}
@@ -221,28 +129,19 @@ class ExcellentEnchantsDependency {
return handleRechargeMethod.invoke(this.usedAnvilListener, event, first, second) as Boolean
}
- fun treatAnvilResult(event: CATreatAnvilResult2Event) {
- val result = event.result ?: return
+ fun treatAnvilResult(event: PrepareAnvilEvent, result: ItemStack) {
+ val first: ItemStack = treatInput(event.inventory.getItem(0))
+ val second: ItemStack = treatInput(event.inventory.getItem(1))
- val first: ItemStack = treatInput(event.leftItem)
- val second: ItemStack = treatInput(event.rightItem)
- val fakeEvent = prepareAnvilConstructor.newInstance(event.view, result)
-
- handleCombineMethod.invoke(this.usedAnvilListener, fakeEvent, first, second, result)
-
- event.result = fakeEvent.result
+ handleCombineMethod.invoke(this.usedAnvilListener, 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,
- -> v5AnvilListener!!.onClickAnvil(event)
- ListenerVersion.PRE_V5 -> preV5AnvilListener!!.onClickAnvil(event)
- ListenerVersion.LEGACY -> legacyAnvilListener!!.onClickAnvil(event)
- null -> {}
+ if (this.isModern) {
+ this.modernAnvilListener!!.onClickAnvil(event)
+ } else {
+ this.legacyAnvilListener!!.onClickAnvil(event)
}
return event.inventory.getItem(2) == null
}
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..95be29e 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/GenericPluginDependency.kt
@@ -5,14 +5,20 @@ 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) {
+abstract class GenericPluginDependency(val plugin: Plugin) {
- private val preAnvil = ArrayList()
- private val postAnvil = ArrayList()
+ protected val preAnvil = ArrayList()
+ protected val postAnvil = ArrayList()
open fun redirectListeners() {
- fillPreAnvil(preAnvil)
- fillPostAnvil(postAnvil, preAnvil)
+ // get PreAnvil and PostAnvil listeners
+ for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) {
+
+ if (registeredListener.plugin != plugin) continue
+ preAnvil.add(registeredListener)
+ }
+
+ postAnvil.addAll(postAnvilEvents())
// get required PrepareAnvilEvent listener
for (listener in preAnvil) {
@@ -22,37 +28,17 @@ open class GenericPluginDependency(protected open val plugin: Plugin, private va
for (listener in postAnvil) {
InventoryClickEvent.getHandlerList().unregister(listener)
}
- }
-
- open fun fillPreAnvil(preAnvil: ArrayList){
- // get PreAnvil and PostAnvil listeners
- for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) {
-
- if (registeredListener.plugin != plugin) continue
- preAnvil.add(registeredListener)
- }
- }
-
- protected open fun fillPostAnvil(
- postAnvil: ArrayList,
- preAnvil: ArrayList) {
}
+ protected abstract fun postAnvilEvents(): Collection
+
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 +47,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/dependency/plugins/ToolStatsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ToolStatsDependency.kt
index 255f737..80fd753 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ToolStatsDependency.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ToolStatsDependency.kt
@@ -1,8 +1,10 @@
package xyz.alexcrea.cuanvil.dependency.plugins
+import io.delilaheve.CustomAnvil
import lol.hyper.toolstats.ToolStats
import lol.hyper.toolstats.tools.ItemChecker
import org.bukkit.event.inventory.InventoryClickEvent
+import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.Plugin
import org.bukkit.plugin.RegisteredListener
@@ -11,7 +13,7 @@ import java.lang.reflect.Method
class ToolStatsDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
- // Sadly, getTokens function is private, so I need to do some reflectino
+ // Sadly, getTokens function is private, so I need to do that
private val getTokenMethod: Method =
ItemChecker::class.java.getDeclaredMethod("getTokens", ItemStack::class.java);
@@ -19,9 +21,15 @@ class ToolStatsDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
getTokenMethod.trySetAccessible()
}
- private fun ItemChecker.getTokenSafe(item: ItemStack?): Array {
- if (item == null) return arrayOf()
- return getTokenMethod.invoke(this, item) as Array
+ override fun postAnvilEvents(): Collection {
+ return listOf()
+ }
+
+ override fun testPrepareAnvil(event: PrepareAnvilEvent): Boolean {
+ var result = super.testPrepareAnvil(event)
+ CustomAnvil.verboseLog("pre anvil result: $result")
+
+ return result
}
override fun testAnvilResult(event: InventoryClickEvent): Boolean {
@@ -31,9 +39,12 @@ class ToolStatsDependency(plugin: Plugin) : GenericPluginDependency(plugin) {
val itemChecker = (plugin as ToolStats).itemChecker
- val leftTokens = itemChecker.getTokenSafe(left)
- val resultToken = itemChecker.getTokenSafe(result)
+ val leftTokens = getTokenMethod.invoke(itemChecker, left) as Array
+ val resultToken = getTokenMethod.invoke(itemChecker, result) as Array
- return !leftTokens.contentDeepEquals(resultToken);
+ val resultVal = !leftTokens.contentDeepEquals(resultToken)
+
+ CustomAnvil.verboseLog("Test anvil result: $resultVal")
+ return resultVal
}
}
diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt
index 8c04162..b26dd42 100644
--- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt
+++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt
@@ -6,12 +6,12 @@ import org.bukkit.plugin.Plugin
class BukkitScheduler : TaskScheduler {
- override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any {
+ override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any? {
return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time)
}
- override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any {
+ override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? {
return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time)
}
}
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