diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index d3cfd8b3..6de29076 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -40,6 +40,8 @@ Custom Items support is considered unstable. If you find issue please report it - [Disenchantment](https://www.spigotmc.org/resources/disenchantment-1-21-1-1-20-6-new-book-splitting-mechanics.110741/) by H7KZ Partially use Custom Anvil maximum XP settings (>= 6.1.5) +- [EnchantedBook](https://modrinth.com/plugin/enchantedbook) by Minacle + - [HavenBags](https://www.spigotmc.org/resources/havenbags-shulker-like-player-bound-bags-1-17-1-21-4.110420/) by hyperdefined For bag upgrade and skin via anvil. (version >= 1.31.0) diff --git a/build.gradle.kts b/build.gradle.kts index 214a49f9..15252c9d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -58,7 +58,7 @@ dependencies { compileOnly("org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") // fast stats - implementation("dev.faststats.metrics:bukkit:0.27.0") + implementation("dev.faststats.metrics:bukkit:0.27.2") // minimessage implementation("net.kyori:adventure-text-minimessage:4.25.0") diff --git a/defaultconfigs/1.21.11/config.yml b/defaultconfigs/1.21.11/config.yml index 8b5747b1..c3ea6204 100644 --- a/defaultconfigs/1.21.11/config.yml +++ b/defaultconfigs/1.21.11/config.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21.11/enchant_conflict.yml b/defaultconfigs/1.21.11/enchant_conflict.yml index 18341d36..bbbeac71 100644 --- a/defaultconfigs/1.21.11/enchant_conflict.yml +++ b/defaultconfigs/1.21.11/enchant_conflict.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # @@ -275,10 +275,7 @@ restriction_sweeping_edge: - enchanted_book - swords -# Do not exist in 1.18, that mean useInFuture will be set to true -# useInFuture set to true also mean it will not warn if there is an issue restriction_swift_sneak: - useInFuture: true enchantments: - minecraft:swift_sneak notAffectedGroups: diff --git a/defaultconfigs/1.21.11/item_groups.yml b/defaultconfigs/1.21.11/item_groups.yml index 5d24cacf..e2ebdb3e 100644 --- a/defaultconfigs/1.21.11/item_groups.yml +++ b/defaultconfigs/1.21.11/item_groups.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21.11/unit_repair_item.yml b/defaultconfigs/1.21.11/unit_repair_item.yml index d742a056..24f8460b 100644 --- a/defaultconfigs/1.21.11/unit_repair_item.yml +++ b/defaultconfigs/1.21.11/unit_repair_item.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21.9/config.yml b/defaultconfigs/1.21.9/config.yml index c7700969..614c8df0 100644 --- a/defaultconfigs/1.21.9/config.yml +++ b/defaultconfigs/1.21.9/config.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21.9/enchant_conflict.yml b/defaultconfigs/1.21.9/enchant_conflict.yml index 8ab9e3bc..c161982e 100644 --- a/defaultconfigs/1.21.9/enchant_conflict.yml +++ b/defaultconfigs/1.21.9/enchant_conflict.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # @@ -272,10 +272,7 @@ restriction_sweeping_edge: - enchanted_book - swords -# Do not exist in 1.18, that mean useInFuture will be set to true -# useInFuture set to true also mean it will not warn if there is an issue restriction_swift_sneak: - useInFuture: true enchantments: - minecraft:swift_sneak notAffectedGroups: diff --git a/defaultconfigs/1.21.9/item_groups.yml b/defaultconfigs/1.21.9/item_groups.yml index f7a00bcc..a1af375e 100644 --- a/defaultconfigs/1.21.9/item_groups.yml +++ b/defaultconfigs/1.21.9/item_groups.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21.9/unit_repair_item.yml b/defaultconfigs/1.21.9/unit_repair_item.yml index 122b9657..1f256100 100644 --- a/defaultconfigs/1.21.9/unit_repair_item.yml +++ b/defaultconfigs/1.21.9/unit_repair_item.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21/config.yml b/defaultconfigs/1.21/config.yml index 1ef0d102..a0bcbd86 100644 --- a/defaultconfigs/1.21/config.yml +++ b/defaultconfigs/1.21/config.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21/enchant_conflict.yml b/defaultconfigs/1.21/enchant_conflict.yml index d3b5d33c..1806abd4 100644 --- a/defaultconfigs/1.21/enchant_conflict.yml +++ b/defaultconfigs/1.21/enchant_conflict.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21/item_groups.yml b/defaultconfigs/1.21/item_groups.yml index 6963d2e4..7956fb61 100644 --- a/defaultconfigs/1.21/item_groups.yml +++ b/defaultconfigs/1.21/item_groups.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/defaultconfigs/1.21/unit_repair_item.yml b/defaultconfigs/1.21/unit_repair_item.yml index b7873a12..3fafd476 100644 --- a/defaultconfigs/1.21/unit_repair_item.yml +++ b/defaultconfigs/1.21/unit_repair_item.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dialog/AnvilRenameDialogImpl.kt b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dialog/AnvilRenameDialogImpl.kt index e210daa9..7761cd57 100644 --- a/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dialog/AnvilRenameDialogImpl.kt +++ b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dialog/AnvilRenameDialogImpl.kt @@ -18,8 +18,8 @@ import org.bukkit.craftbukkit.inventory.CraftInventoryView import org.bukkit.craftbukkit.inventory.view.CraftAnvilView import org.bukkit.entity.HumanEntity import org.bukkit.event.inventory.PrepareAnvilEvent -import org.bukkit.inventory.InventoryView import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.view.AnvilView import org.bukkit.persistence.PersistentDataType import org.bukkit.plugin.Plugin import java.util.* @@ -121,7 +121,7 @@ class AnvilRenameDialogImpl( } } - private fun setResult(player: HumanEntity, view: InventoryView, result: String?) { + private fun setResult(player: HumanEntity, view: AnvilView, result: String?) { val defaultName = itemDefaultName(view.getItem(0)) if (defaultName == result) { setName(player, view, "", null) @@ -129,7 +129,7 @@ class AnvilRenameDialogImpl( } else setName(player, view, result, result) } - private fun setName(player: HumanEntity, view: InventoryView, name: String?, rename: String?) { + private fun setName(player: HumanEntity, view: AnvilView, name: String?, rename: String?) { val menu = (containerField.get(view) as AnvilMenu) val isSameName = menu.itemName == name menu.itemName = rename diff --git a/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilTitleUtil.kt b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilTitleUtil.kt index e40e7ede..dc8ac092 100644 --- a/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilTitleUtil.kt +++ b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilTitleUtil.kt @@ -2,17 +2,18 @@ package xyz.alexcrea.cuanvil.util import io.papermc.paper.threadedregions.scheduler.ScheduledTask import org.bukkit.entity.HumanEntity -import org.bukkit.inventory.InventoryView +import org.bukkit.inventory.view.AnvilView import org.bukkit.plugin.Plugin import xyz.alexcrea.cuanvil.dialog.AnvilRenameDialog import java.util.HashMap import java.util.UUID +@Suppress("UnstableApiUsage") object AnvilTitleUtil { private val runTaskMap = HashMap() - private fun actualRename(view: InventoryView, name: String, player: HumanEntity, anvilDialog: AnvilRenameDialog) { + private fun actualRename(view: AnvilView, name: String, player: HumanEntity, anvilDialog: AnvilRenameDialog) { runTaskMap.remove(player.uniqueId) if (view.title == name) return @@ -24,7 +25,7 @@ object AnvilTitleUtil { // We don't want to rename instantly it is causing issue with rename text // especially as it can "override" current ui when it is rename ui time but rename ui also need some delay - fun rename(view: InventoryView, name: String, player: HumanEntity, anvilDialog: AnvilRenameDialog, plugin: Plugin) { + fun rename(view: AnvilView, name: String, player: HumanEntity, anvilDialog: AnvilRenameDialog, plugin: Plugin) { runTaskMap.remove(player.uniqueId)?.cancel() val task = player.scheduler.runDelayed( diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java b/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java index c0a5ff2b..0bc7aa4d 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java @@ -128,7 +128,7 @@ public class EnchantmentApi { * @return The custom anvil enchantment of this key. null if not found. */ @Nullable - public static CAEnchantment getByKey(@NotNull NamespacedKey key) { + public static CAEnchantment getByKey(@Nullable NamespacedKey key) { return CAEnchantment.getByKey(key); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java index fed90277..e17b36d0 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java @@ -230,7 +230,7 @@ public interface CAEnchantment { * @param key The enchantment key * @return Array of enchantment. */ - static @Nullable CAEnchantment getByKey(@NotNull NamespacedKey key){ + static @Nullable CAEnchantment getByKey(@Nullable NamespacedKey key){ return CAEnchantmentRegistry.getInstance().getByKey(key); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java index ec83616d..4d930d82 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java @@ -151,7 +151,7 @@ public class CAEnchantmentRegistry { * @return Registered enchantment. null if absent. */ @Nullable - public CAEnchantment getByKey(@NotNull NamespacedKey key) { + public CAEnchantment getByKey(@Nullable NamespacedKey key) { return byKeyMap.get(key); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java index c548f228..92418a3a 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java +++ b/src/main/java/xyz/alexcrea/cuanvil/update/UpdateHandler.java @@ -30,10 +30,11 @@ public class UpdateHandler { 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, - new Version(1, 17, 7), PUpdate_1_17_7::handleUpdate + new Version(1, 18, 0), PUpdate_1_18::handleUpdate ); private static final List mcUpdateMap = List.of( + new Update_1_19(), new Update_1_20_5(), new Update_1_21(), new Update_1_21_9(), diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_19.java b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_19.java new file mode 100644 index 00000000..fc598658 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/update/minecraft/Update_1_19.java @@ -0,0 +1,40 @@ +package xyz.alexcrea.cuanvil.update.minecraft; + +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.config.ConfigHolder; +import xyz.alexcrea.cuanvil.update.Version; + +import java.util.HashSet; +import java.util.Set; + +import static xyz.alexcrea.cuanvil.update.UpdateUtils.addAbsentToList; + +public class Update_1_19 extends MCUpdate { + + public Update_1_19() { + super(new Version(1, 19)); + } + + @Override + protected void doUpdate() { + var tosave = new HashSet(); + updateName(tosave); + + for (ConfigHolder holder : tosave) { + holder.saveToDisk(true); + } + } + + public static void updateName(@NotNull Set tosave) { + var conflict = ConfigHolder.CONFLICT_HOLDER.getConfig(); + + addAbsentToList(conflict, "restriction_swift_sneak.enchantments", "minecraft:swift_sneak"); + addAbsentToList(conflict, "restriction_swift_sneak.notAffectedGroups", "leggings", "enchanted_book"); + + ConfigHolder.ITEM_GROUP_HOLDER.reload(); + + tosave.add(ConfigHolder.DEFAULT_CONFIG); + tosave.add(ConfigHolder.CONFLICT_HOLDER); + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_17_7.java b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_18.java similarity index 74% rename from src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_17_7.java rename to src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_18.java index 972825dd..b52ec7ac 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_17_7.java +++ b/src/main/java/xyz/alexcrea/cuanvil/update/plugin/PUpdate_1_18.java @@ -3,19 +3,20 @@ package xyz.alexcrea.cuanvil.update.plugin; 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_19; import xyz.alexcrea.cuanvil.update.minecraft.Update_1_20_5; import javax.annotation.Nonnull; import java.util.Set; -public class PUpdate_1_17_7 { +public class PUpdate_1_18 { public static void handleUpdate(@Nonnull Set toSave) { - // fix only needed for 1.20.5 and above Version current = UpdateUtils.currentMinecraftVersion(); - if (new Version(1, 20, 5).greaterThan(current)) return; + if (new Version(1, 19, 0).greaterThan(current)) return; + Update_1_19.updateName(toSave); + if (new Version(1, 20, 5).greaterThan(current)) return; Update_1_20_5.updateName(toSave); } - } diff --git a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt index 4ed9753a..b883f3e9 100644 --- a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt @@ -1,9 +1,10 @@ package io.delilaheve.util +import org.bukkit.Material 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 kotlin.math.ceil import kotlin.math.max @@ -19,6 +20,13 @@ object ItemUtil { */ fun ItemStack.isEnchantedBook() = type == ENCHANTED_BOOK + private fun maxDamage(type: Material, damageable: Damageable): Int { + val ver = UpdateUtils.currentMinecraftVersion() + if(ver.major <= 1 && ver.minor <= 20 && ver.patch < 5) return type.maxDurability.toInt() + + return if(damageable.hasMaxDamage()) damageable.maxDamage else type.maxDurability.toInt() + } + /** * Set this [ItemStack]s durability from a combination of the * [first] and [second] item's durability values @@ -28,23 +36,22 @@ object ItemUtil { first: ItemStack, second: ItemStack ): Boolean { - (itemMeta as? Damageable)?.let { - val durability = type.maxDurability.toInt() - val firstDamage = (first.itemMeta as? Damageable)?.damage ?: 0 - if (firstDamage == 0) return false + val meta = itemMeta + if(meta !is Damageable) return false - val firstDurability = durability - firstDamage - val secondDamage = (second.itemMeta as? Damageable)?.damage ?: 0 - val secondDurability = durability - secondDamage - val combinedDurability = firstDurability + secondDurability - val newDurability = min(combinedDurability, durability) - val maxDamage = if(it.hasMaxDamage()) it.maxDamage else Int.MAX_VALUE + val maxDamage = maxDamage(type, meta) + val damage = (first.itemMeta as? Damageable)?.damage ?: 0 + if (damage == 0) return false - it.damage = min(durability - newDurability, maxDamage) - itemMeta = it - return true - } - return false + val firstDurability = maxDamage - damage + val secondDamage = (second.itemMeta as? Damageable)?.damage ?: 0 + val secondDurability = maxDamage - secondDamage + val combinedDurability = firstDurability + secondDurability + val newDurability = min(combinedDurability, maxDamage) + + meta.damage = min(maxDamage - newDurability, maxDamage) + this.itemMeta = meta + return true } fun ItemStack.unitRepair( diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt index efbf2902..c2293afc 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/DiagnosticExecutor.kt @@ -129,9 +129,9 @@ class DiagnosticExecutor : CASubCommand { 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); + sender.spigot().sendMessage(message) } else { - sender.sendMessage(stb.toString()); + sender.sendMessage(stb.toString()) } return true @@ -266,8 +266,8 @@ class DiagnosticExecutor : CASubCommand { try { val fakeInv = Bukkit.createInventory(player, InventoryType.ANVIL) invView = player.openInventory(fakeInv)!! as AnvilView - event = PrepareAnvilEvent(invView, result) - } catch (e: Throwable) { + event = DependencyManager.createFakeEvent(invView, result) + } catch (_: Throwable) { // Help val menuTypeClazz = Class.forName("org.bukkit.inventory.MenuType") val anvilTypeField = menuTypeClazz.getField("ANVIL") diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EnchantExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EnchantExecutor.kt index fdae6b04..654df1a8 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/EnchantExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/EnchantExecutor.kt @@ -2,10 +2,14 @@ package xyz.alexcrea.cuanvil.command import io.delilaheve.CustomAnvil import io.delilaheve.util.ConfigOptions +import io.delilaheve.util.ItemUtil.isEnchantedBook +import org.bukkit.Material +import org.bukkit.NamespacedKey import org.bukkit.command.Command import org.bukkit.command.CommandSender import org.bukkit.entity.HumanEntity import xyz.alexcrea.cuanvil.api.EnchantmentApi +import xyz.alexcrea.cuanvil.enchant.CAEnchantment import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir class EnchantExecutor : CASubCommand { @@ -37,22 +41,18 @@ class EnchantExecutor : CASubCommand { sender.sendMessage("Missing enchantment parameter") return true } - - 1 -> { - sender.sendMessage("Missing level parameter") - return true - } } - val enchants = EnchantmentApi.getByName(args[0].lowercase()) - if (enchants.isEmpty()) { + val enchant = firstEnchantment(args[0]) + if (enchant == null) { sender.sendMessage("Enchantment not found: ${args[0]}") return true } - val enchant = enchants.iterator().next() + val level = if (args.size > 1) + args[1].toIntOrNull()?.coerceIn(0, ConfigOptions.ENCHANT_LIMIT) + else 1 - val level = args[1].toIntOrNull()?.coerceIn(0, ConfigOptions.ENCHANT_LIMIT) if (level == null) { sender.sendMessage("Invalid number: ${args[1]}") return true @@ -66,8 +66,15 @@ class EnchantExecutor : CASubCommand { if (level == 0) { enchant.removeFrom(inHand) + + if (inHand.isEnchantedBook() && EnchantmentApi.getEnchantments(inHand).isEmpty()) + inHand.type = Material.BOOK + sender.sendMessage("${enchant.prettyName} removed") } else { + if (Material.BOOK == inHand.type) + inHand.type = Material.ENCHANTED_BOOK + enchant.addEnchantmentUnsafe(inHand, level) sender.sendMessage("${enchant.prettyName} set to level $level") } @@ -92,10 +99,8 @@ class EnchantExecutor : CASubCommand { sender: HumanEntity, name: String ): Collection { - val enchants = EnchantmentApi.getByName(name.lowercase()) - if (enchants.isEmpty()) return listOf() + val enchant = firstEnchantment(name) ?: return listOf() - val enchant = enchants.iterator().next() val limit = ConfigOptions.enchantLimit(enchant) val result = mutableListOf() @@ -110,4 +115,12 @@ class EnchantExecutor : CASubCommand { return result } + private fun firstEnchantment(name: String): CAEnchantment? { + val enchants = EnchantmentApi.getByName(name.lowercase()) + if (!enchants.isEmpty()) + return enchants.iterator().next() + + return EnchantmentApi.getByKey(NamespacedKey.fromString(name)) + } + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index 50743d81..25b3e62a 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -30,6 +30,7 @@ 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.lang.reflect.Constructor import java.util.logging.Level @Suppress("UnstableApiUsage") @@ -120,6 +121,10 @@ object DependencyManager { genericDependencies.add(compatibility) } + if (pluginManager.isPluginEnabled("EnchantedBook")) { + genericDependencies.add(EnchantedBookDependency(pluginManager.getPlugin("EnchantedBook")!!)) + } + for (dependency in genericDependencies) dependency.redirectListeners() @@ -325,4 +330,12 @@ object DependencyManager { enchantmentSquaredCompatibility?.updateLore(item) } + + private val prepareAnvilConstructor = + PrepareAnvilEvent::class.java.constructors.first() as Constructor + + fun createFakeEvent(view: AnvilView, result: ItemStack?): PrepareAnvilEvent { + return prepareAnvilConstructor.newInstance(view, result) + } + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt index b9410886..cd62c816 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt @@ -1,10 +1,11 @@ package xyz.alexcrea.cuanvil.dependency.gui -import org.bukkit.inventory.InventoryView +import org.bukkit.inventory.view.AnvilView import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil import java.lang.reflect.Method +@Suppress("UnstableApiUsage") class GenericExternGuiTester { companion object { @@ -21,7 +22,7 @@ class GenericExternGuiTester { var testedClass: String? = null lateinit var getHandleMethod: Method - private fun getContainerClass(view: InventoryView): Class? { + private fun getContainerClass(view: AnvilView): Class? { if(!testedClass.contentEquals(view.javaClass.name)) return null @@ -64,7 +65,7 @@ class GenericExternGuiTester { } // Try if were in another plugin anvil inventory - fun testIfGui(view: InventoryView): Boolean { + fun testIfGui(view: AnvilView): Boolean { // In case we are in a test environment if(isInTest()) return false diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt new file mode 100644 index 00000000..da3a57e2 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/EnchantedBookDependency.kt @@ -0,0 +1,34 @@ +package xyz.alexcrea.cuanvil.dependency.plugins + +import org.bukkit.event.Event +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.inventory.view.AnvilView +import org.bukkit.plugin.Plugin +import xyz.alexcrea.cuanvil.dependency.DependencyManager +import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_LEFT +import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT + +@Suppress("UnstableApiUsage") +class EnchantedBookDependency(plugin: Plugin) : GenericPluginDependency(plugin) { + + override fun testAnvilResult(event: InventoryClickEvent): Boolean { + val view = event.view as? AnvilView ?: return false + val inv = event.inventory + + //TODO use view here (v2) + val current = inv.getItem(ANVIL_OUTPUT_SLOT) + inv.setItem(ANVIL_OUTPUT_SLOT, null) + val fakeEvent = DependencyManager.createFakeEvent(view, null) + + if (testPrepareAnvil(fakeEvent)) { + event.result = Event.Result.DEFAULT + + inv.setItem(ANVIL_INPUT_LEFT, fakeEvent.result) + return true + } + + inv.setItem(ANVIL_INPUT_LEFT, current) + return false + } + +} 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 9370decd..a41bdea0 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/ExcellentEnchantsDependency.kt @@ -8,12 +8,12 @@ import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.inventory.ItemStack import org.bukkit.plugin.RegisteredListener import xyz.alexcrea.cuanvil.api.EnchantmentApi +import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.api.event.listener.CATreatAnvilResultEvent import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEPreV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAEEV5_4Enchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CALegacyEEEnchantment -import java.lang.reflect.Constructor import java.lang.reflect.Method import su.nightexpress.excellentenchants.api.EnchantRegistry as V5EnchantRegistry import su.nightexpress.excellentenchants.enchantment.impl.universal.CurseOfFragilityEnchant as LegacyCurseOfFragilityEnchant @@ -47,7 +47,7 @@ class ExcellentEnchantsDependency { listenerVersion = value break - } catch (ignored: ClassNotFoundException) { + } catch (_: ClassNotFoundException) { } } @@ -60,7 +60,7 @@ class ExcellentEnchantsDependency { var isModernCurseOfFragility = true try { Class.forName("su.nightexpress.excellentenchants.enchantment.universal.CurseOfFragilityEnchant") - } catch (ignored: ClassNotFoundException) { + } catch (_: ClassNotFoundException) { isModernCurseOfFragility = false } @@ -118,8 +118,6 @@ class ExcellentEnchantsDependency { private lateinit var handleRechargeMethod: Method private lateinit var handleCombineMethod: Method - private val prepareAnvilConstructor = PrepareAnvilEvent::class.java.constructors.first() as Constructor - fun redirectListeners() { val toUnregister = ArrayList() // get required PrepareAnvilEvent listener @@ -227,7 +225,7 @@ class ExcellentEnchantsDependency { val first: ItemStack = treatInput(event.leftItem) val second: ItemStack = treatInput(event.rightItem) - val fakeEvent = prepareAnvilConstructor.newInstance(event.view, result) + val fakeEvent = DependencyManager.createFakeEvent(event.view, result) handleCombineMethod.invoke(this.usedAnvilListener, fakeEvent, first, second, result) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index c235abd4..1aa956e2 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -3,7 +3,6 @@ package xyz.alexcrea.cuanvil.group import io.delilaheve.CustomAnvil import org.bukkit.NamespacedKey import org.bukkit.configuration.ConfigurationSection -import org.bukkit.enchantments.Enchantment import org.bukkit.inventory.ItemStack import xyz.alexcrea.cuanvil.api.EnchantmentApi import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment @@ -32,10 +31,6 @@ class EnchantConflictManager { // Path for the maximum number of enchantment before validating the conflict const val ENCH_MAX_PATH = "maxEnchantmentBeforeConflict" - // Path for a flag: if the enchantment will be used in the last supported version - // TODO maybe replace this system by a list of "future" enchantment. - private const val FUTURE_USE_PATH = "useInFuture" - // Default name for a joining group const val DEFAULT_GROUP_NAME = "joinedGroup" } @@ -100,8 +95,6 @@ class EnchantConflictManager { itemManager: ItemGroupManager, conflictName: String ): EnchantConflictGroup { - // Is it planed for the future - val futureUse = section.getBoolean(FUTURE_USE_PATH, false) // Create conflict val conflict = createConflictObject(section, itemManager, conflictName) // Read and add enchantment to conflict @@ -109,17 +102,13 @@ class EnchantConflictManager { for (enchantName in enchantList) { val enchants = getEnchantByIdentifier(enchantName) if (enchants.isEmpty()) { - if (!futureUse) { //TODO future use will be deprecated once the new update system is finished - CustomAnvil.instance.logger.warning("Enchantment $enchantName do not exist but was asked for conflict $conflictName") - } + CustomAnvil.instance.logger.warning("Enchantment $enchantName do not exist but was asked for conflict $conflictName") continue } conflict.addEnchantments(enchants) } if (conflict.getEnchants().isEmpty()) { - if (!futureUse) { //TODO future use will be deprecated once the new update system is finished - CustomAnvil.instance.logger.warning("Conflict $conflictName do not have valid enchantment, it will not do anything") - } + CustomAnvil.instance.logger.warning("Conflict $conflictName do not have valid enchantment, it will not do anything") } val conflictsAfterLevel = section.getConfigurationSection(CONFLICT_AFTER_LEVEL_LIST_PATH) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0a0c5664..6d946d4d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit most of these config. +# It is recommended that you use /ca config to edit most of these config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/src/main/resources/enchant_conflict.yml b/src/main/resources/enchant_conflict.yml index 0af1be6e..047b1b26 100644 --- a/src/main/resources/enchant_conflict.yml +++ b/src/main/resources/enchant_conflict.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # @@ -160,10 +160,6 @@ restriction_sweeping_edge: enchantments: [ minecraft:sweeping, minecraft:sweeping_edge ] notAffectedGroups: [ enchanted_book, swords ] -restriction_swift_sneak: - enchantments: [ minecraft:swift_sneak ] - notAffectedGroups: [ enchanted_book, leggings ] - restriction_thorns: enchantments: [ minecraft:thorns ] notAffectedGroups: [ enchanted_book, armors ] diff --git a/src/main/resources/item_groups.yml b/src/main/resources/item_groups.yml index 1dd06a1d..cccfc1f8 100644 --- a/src/main/resources/item_groups.yml +++ b/src/main/resources/item_groups.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! # diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4828330b..0b377edf 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -72,3 +72,4 @@ softdepend: - ExcellentEnchants - HavenBags - SuperEnchants + - EnchantedBook diff --git a/src/main/resources/unit_repair_item.yml b/src/main/resources/unit_repair_item.yml index 98fd0bec..a8bbcbe3 100644 --- a/src/main/resources/unit_repair_item.yml +++ b/src/main/resources/unit_repair_item.yml @@ -1,5 +1,5 @@ # -# It is recommended that you use /configanvil to edit theses config. +# It is recommended that you use /ca config to edit theses config. # You can still manually edit here if you like to. but if you do, don't forget to /ca reload after you changes ! #