From 4399137733f4cc03c7f748e0701c3e0a74afb7db Mon Sep 17 00:00:00 2001 From: nulli0n Date: Wed, 18 Sep 2024 21:29:11 +0500 Subject: [PATCH] v4.2.2 --- API/pom.xml | 2 +- Core/pom.xml | 9 ++-- .../command/BaseCommands.java | 38 ++++++++++++++-- .../command/CommandArguments.java | 10 ++--- .../excellentenchants/config/Lang.java | 13 +++++- .../excellentenchants/config/Perms.java | 2 + .../impl/fishing/AutoReelEnchant.java | 1 + .../impl/tool/SilkChestEnchant.java | 40 +++++++++++------ .../hook/impl/PacketEventsHook.java | 43 ++++++++++++------- MC_1_21/pom.xml | 6 +-- .../excellentenchants/Internal_1_21.java | 2 - NMS/pom.xml | 4 +- pom.xml | 2 +- 13 files changed, 119 insertions(+), 53 deletions(-) diff --git a/API/pom.xml b/API/pom.xml index 20815a5..21f71df 100644 --- a/API/pom.xml +++ b/API/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 4.2.1 + 4.2.2 4.0.0 diff --git a/Core/pom.xml b/Core/pom.xml index 997771a..29811a4 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 4.2.1 + 4.2.2 4.0.0 @@ -48,7 +48,6 @@ codemc-releases https://repo.codemc.io/repository/maven-releases/ - @@ -90,19 +89,19 @@ su.nightexpress.excellentenchants API - 4.2.1 + 4.2.2 su.nightexpress.excellentenchants NMS - 4.2.1 + 4.2.2 su.nightexpress.excellentenchants MC_1_21 - 4.2.1 + 4.2.2 diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/BaseCommands.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/BaseCommands.java index 5ed4455..20c9e30 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/command/BaseCommands.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/command/BaseCommands.java @@ -52,6 +52,15 @@ public class BaseCommands { .executes((context, arguments) -> enchantItem(plugin, context, arguments)) ); + rootNode.addChildren(DirectNode.builder(plugin, "disenchant") + .description(Lang.COMMAND_DISENCHANT_DESC) + .permission(Perms.COMMAND_DISENCHANT) + .withArgument(CommandArguments.enchantArgument(CommandArguments.ENCHANT).required()) + .withArgument(ArgumentTypes.player(CommandArguments.PLAYER)) + .withArgument(CommandArguments.slotArgument(CommandArguments.SLOT)) + .executes((context, arguments) -> disenchantItem(plugin, context, arguments)) + ); + rootNode.addChildren(DirectNode.builder(plugin, "list") .playerOnly() .description(Lang.COMMAND_LIST_DESC) @@ -85,7 +94,7 @@ public class BaseCommands { private static int getLevel(@NotNull Enchantment enchantment, @NotNull ParsedArguments arguments) { int level = arguments.getIntArgument(CommandArguments.LEVEL, -1); - if (level < 1) { + if (level <= 0) { level = EnchantUtils.randomLevel(enchantment); } return level; @@ -128,9 +137,6 @@ public class BaseCommands { if (level > 0) { EnchantUtils.add(item, enchantment, level, true); } - else EnchantUtils.remove(item, enchantment); - - //player.getInventory().setItem(slot, item); (context.getSender() == player ? Lang.COMMAND_ENCHANT_DONE_SELF : Lang.COMMAND_ENCHANT_DONE_OTHERS).getMessage() .replace(Placeholders.forPlayer(player)) @@ -142,6 +148,30 @@ public class BaseCommands { return true; } + public static boolean disenchantItem(@NotNull EnchantsPlugin plugin, @NotNull CommandContext context, @NotNull ParsedArguments arguments) { + Player player = CommandUtil.getPlayerOrSender(context, arguments, CommandArguments.PLAYER); + if (player == null) return false; + + EquipmentSlot slot = arguments.getArgument(CommandArguments.SLOT, EquipmentSlot.class, EquipmentSlot.HAND); + + ItemStack item = player.getInventory().getItem(slot); + if (item == null || item.getType().isAir()) { + Lang.COMMAND_ENCHANT_ERROR_NO_ITEM.getMessage().send(context.getSender()); + return false; + } + + Enchantment enchantment = arguments.getEnchantmentArgument(CommandArguments.ENCHANT); + EnchantUtils.remove(item, enchantment); + + (context.getSender() == player ? Lang.COMMAND_DISENCHANT_DONE_SELF : Lang.COMMAND_DISENCHANT_DONE_OTHERS).getMessage() + .replace(Placeholders.forPlayer(player)) + .replace(Placeholders.GENERIC_ITEM, ItemUtil.getItemName(item)) + .replace(Placeholders.GENERIC_ENCHANT, EnchantUtils.getLocalized(enchantment)) + .send(context.getSender()); + + return true; + } + public static boolean giveFuel(@NotNull EnchantsPlugin plugin, @NotNull CommandContext context, @NotNull ParsedArguments arguments) { Player player = context.getPlayerOrThrow(); CustomEnchantment enchantment = arguments.getArgument(CommandArguments.ENCHANT, CustomEnchantment.class); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/CommandArguments.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/CommandArguments.java index 5a038e9..97cdff9 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/command/CommandArguments.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/command/CommandArguments.java @@ -18,12 +18,12 @@ import java.util.Arrays; public class CommandArguments { - public static final String PLAYER = "player"; - public static final String AMOUNT = "amount"; - public static final String LEVEL = "level"; + public static final String PLAYER = "player"; + public static final String AMOUNT = "amount"; + public static final String LEVEL = "level"; public static final String ENCHANT = "enchant"; - public static final String SLOT = "slot"; - public static final String RARITY = "rarity"; + public static final String SLOT = "slot"; + public static final String RARITY = "rarity"; @NotNull public static ArgumentBuilder enchantArgument(@NotNull String name) { diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/config/Lang.java b/Core/src/main/java/su/nightexpress/excellentenchants/config/Lang.java index f733e6d..cfdd70d 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/config/Lang.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/config/Lang.java @@ -9,12 +9,13 @@ import static su.nightexpress.nightcore.util.text.tag.Tags.*; public class Lang extends CoreLang { - public static final LangString COMMAND_ARGUMENT_NAME_LEVEL = LangString.of("Command.Argument.Name.Level", "level"); - public static final LangString COMMAND_ARGUMENT_NAME_SLOT = LangString.of("Command.Argument.Name.Slot", "slot"); + public static final LangString COMMAND_ARGUMENT_NAME_LEVEL = LangString.of("Command.Argument.Name.Level", "level"); + public static final LangString COMMAND_ARGUMENT_NAME_SLOT = LangString.of("Command.Argument.Name.Slot", "slot"); public static final LangString COMMAND_ARGUMENT_NAME_RARITY = LangString.of("Command.Argument.Name.Rarity", "rarity"); public static final LangString COMMAND_LIST_DESC = LangString.of("Command.List.Desc", "List of custom enchantments."); public static final LangString COMMAND_ENCHANT_DESC = LangString.of("Command.Enchant.Desc", "Enchant item in specific slot."); + public static final LangString COMMAND_DISENCHANT_DESC = LangString.of("Command.Disenchant.Desc", "Disenchant item in specific slot."); public static final LangString COMMAND_BOOK_DESC = LangString.of("Command.Book.Desc", "Give a book with specific enchantment."); public static final LangString COMMAND_RARITY_BOOK_DESC = LangString.of("Command.RarityBook.Desc", "Give a book with enchantment of specific rarity."); public static final LangString COMMAND_GET_FUEL_DESC = LangString.of("Command.GetFuel.Desc", "Get enchantment fuel item."); @@ -41,6 +42,14 @@ public class Lang extends CoreLang { LIGHT_GRAY.enclose(LIGHT_YELLOW.enclose(PLAYER_DISPLAY_NAME) + "'s " + LIGHT_YELLOW.enclose(GENERIC_ITEM) + " enchanted with " + LIGHT_YELLOW.enclose(GENERIC_ENCHANT + " " + GENERIC_LEVEL) + "!") ); + public static final LangText COMMAND_DISENCHANT_DONE_SELF = LangText.of("Command.Disenchant.Done.Self", + LIGHT_GRAY.enclose(LIGHT_YELLOW.enclose(GENERIC_ITEM) + " disenchanted from " + LIGHT_YELLOW.enclose(GENERIC_ENCHANT) + "!") + ); + + public static final LangText COMMAND_DISENCHANT_DONE_OTHERS = LangText.of("Command.Disenchant.Done.Others", + LIGHT_GRAY.enclose(LIGHT_YELLOW.enclose(PLAYER_DISPLAY_NAME) + "'s " + LIGHT_YELLOW.enclose(GENERIC_ITEM) + " disenchanted from " + LIGHT_YELLOW.enclose(GENERIC_ENCHANT) + "!") + ); + public static final LangText COMMAND_ENCHANT_ERROR_NO_ITEM = LangText.of("Command.Enchant.Error.NoItem", LIGHT_RED.enclose("There is no item to enchant!") ); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/config/Perms.java b/Core/src/main/java/su/nightexpress/excellentenchants/config/Perms.java index dc0140b..ddf1ee1 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/config/Perms.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/config/Perms.java @@ -13,6 +13,7 @@ public class Perms { public static final UniPermission COMMAND_BOOK = new UniPermission(PREFIX_COMMAND + "book"); public static final UniPermission COMMAND_ENCHANT = new UniPermission(PREFIX_COMMAND + "enchant"); + public static final UniPermission COMMAND_DISENCHANT = new UniPermission(PREFIX_COMMAND + "disenchant"); public static final UniPermission COMMAND_GET_FUEL = new UniPermission(PREFIX_COMMAND + "getfuel"); public static final UniPermission COMMAND_LIST = new UniPermission(PREFIX_COMMAND + "list"); public static final UniPermission COMMAND_LIST_OTHERS = new UniPermission(PREFIX_COMMAND + "list.others"); @@ -25,6 +26,7 @@ public class Perms { COMMAND.addChildren( COMMAND_BOOK, COMMAND_ENCHANT, + COMMAND_DISENCHANT, COMMAND_GET_FUEL, COMMAND_LIST, COMMAND_LIST_OTHERS, COMMAND_RELOAD, diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java index aa7899d..1daf190 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/fishing/AutoReelEnchant.java @@ -54,6 +54,7 @@ public class AutoReelEnchant extends GameEnchantment implements FishingEnchant { this.plugin.runTask(task -> { if (event.isCancelled()) return; + if (!event.getHook().isValid()) return; plugin.getEnchantNMS().sendAttackPacket(event.getPlayer(), id); plugin.getEnchantNMS().retrieveHook(event.getHook(), item, slot); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/tool/SilkChestEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/tool/SilkChestEnchant.java index 077fa90..443aa44 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/tool/SilkChestEnchant.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/tool/SilkChestEnchant.java @@ -1,5 +1,6 @@ package su.nightexpress.excellentenchants.enchantment.impl.tool; +import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -158,23 +159,38 @@ public class SilkChestEnchant extends GameEnchantment implements BlockDropEnchan @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onSilkChestStore(InventoryClickEvent event) { Inventory inventory = event.getInventory(); - if (inventory.getType() == InventoryType.CRAFTING || inventory.getType() == InventoryType.CREATIVE) return; + if (inventory.getType() != InventoryType.CRAFTING) { + int hotkey = event.getHotbarButton(); + if (hotkey >= 0) { + Player player = (Player) event.getWhoClicked(); + ItemStack hotItem = player.getInventory().getItem(hotkey); + if (hotItem != null && this.isSilkChest(hotItem)) { + event.setCancelled(true); + return; + } + } - Player player = (Player) event.getWhoClicked(); - ItemStack item; - if (event.getHotbarButton() >= 0) { - item = player.getInventory().getItem(event.getHotbarButton()); - } - else item = event.getCurrentItem(); + ItemStack item = event.getCurrentItem(); + if (item == null) return; - if (item == null || item.getType().isAir() || !this.isSilkChest(item)) return; + if (this.isSilkChest(item)) { + event.setCancelled(true); + return; + } - Inventory clicked = event.getClickedInventory(); - if (event.getClick() != ClickType.NUMBER_KEY) { - if (clicked != null && clicked.equals(event.getView().getTopInventory())) return; + return; } - event.setCancelled(true); + ItemStack item = event.getCurrentItem(); + if (item == null) return; + + boolean isRightClick = (event.isRightClick() && !event.isShiftClick()) || event.getClick() == ClickType.CREATIVE; + if (item.getType() == Material.BUNDLE && isRightClick) { + ItemStack cursor = event.getView().getCursor(); // Creative is shit, undetectable. + if (cursor != null && this.isSilkChest(cursor)) { + event.setCancelled(true); + } + } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PacketEventsHook.java b/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PacketEventsHook.java index 0e6fbb8..4bfde3f 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PacketEventsHook.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PacketEventsHook.java @@ -14,6 +14,7 @@ import io.github.retrooper.packetevents.util.SpigotConversionUtil; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import su.nightexpress.excellentenchants.EnchantsPlugin; import su.nightexpress.excellentenchants.util.EnchantUtils; @@ -30,10 +31,6 @@ public class PacketEventsHook { registered = true; } -// public static void shutdown() { -// if (!registered) return; -// } - private static class Listener implements PacketListener { @Override @@ -46,32 +43,46 @@ public class PacketEventsHook { if (type == PacketType.Play.Server.SET_SLOT) { WrapperPlayServerSetSlot setSlot = new WrapperPlayServerSetSlot(event); - ItemStack item = SpigotConversionUtil.toBukkitItemStack(setSlot.getItem()); - item = EnchantUtils.addDescription(item); - - setSlot.setItem(SpigotConversionUtil.fromBukkitItemStack(item)); - event.markForReEncode(true); + ItemStack item = EnchantUtils.addDescription(toBukkit(setSlot.getItem())); + setSlot.setItem(fromBukkit(item)); } else if (type == PacketType.Play.Server.WINDOW_ITEMS) { WrapperPlayServerWindowItems windowItems = new WrapperPlayServerWindowItems(event); windowItems.getItems().replaceAll(packetItem -> { - return SpigotConversionUtil.fromBukkitItemStack(EnchantUtils.addDescription(SpigotConversionUtil.toBukkitItemStack(packetItem))); + return fromBukkit(EnchantUtils.addDescription(toBukkit(packetItem))); }); - - event.markForReEncode(true); } else if (type == PacketType.Play.Server.MERCHANT_OFFERS) { WrapperPlayServerMerchantOffers merchantOffers = new WrapperPlayServerMerchantOffers(event); List offers = merchantOffers.getMerchantOffers(); offers.forEach(offer -> { - ItemStack result = SpigotConversionUtil.toBukkitItemStack(offer.getOutputItem()); - offer.setOutputItem(SpigotConversionUtil.fromBukkitItemStack(EnchantUtils.addDescription(result))); + ItemStack result = toBukkit(offer.getOutputItem()); + offer.setOutputItem(fromBukkit(EnchantUtils.addDescription(result))); }); - - event.markForReEncode(true); } + else return; + + event.markForReEncode(true); + } + + @NotNull + private static ItemStack toBukkit(@NotNull com.github.retrooper.packetevents.protocol.item.ItemStack pooperStack/*, @NotNull ClientVersion version*/) { +// pooperStack.getEnchantments(version).forEach(enchantment -> { +// String name = enchantment.getType().getName().getKey(); +// CustomEnchantment custom = EnchantRegistry.getById(name); +// if (custom == null) return; +// +// EnchantUtils.add(item, custom.getBukkitEnchantment(), enchantment.getLevel(), true); +// }); + + return SpigotConversionUtil.toBukkitItemStack(pooperStack); + } + + @Nullable + private static com.github.retrooper.packetevents.protocol.item.ItemStack fromBukkit(@Nullable ItemStack itemStack) { + return itemStack == null ? null : SpigotConversionUtil.fromBukkitItemStack(itemStack); } } } diff --git a/MC_1_21/pom.xml b/MC_1_21/pom.xml index 462c83a..086a85d 100644 --- a/MC_1_21/pom.xml +++ b/MC_1_21/pom.xml @@ -6,7 +6,7 @@ su.nightexpress.excellentenchants ExcellentEnchants - 4.2.1 + 4.2.2 MC_1_21 @@ -28,13 +28,13 @@ su.nightexpress.excellentenchants API - 4.2.1 + 4.2.2 su.nightexpress.excellentenchants NMS - 4.2.1 + 4.2.2 diff --git a/MC_1_21/src/main/java/su/nightexpress/excellentenchants/Internal_1_21.java b/MC_1_21/src/main/java/su/nightexpress/excellentenchants/Internal_1_21.java index cecc92a..12ab149 100644 --- a/MC_1_21/src/main/java/su/nightexpress/excellentenchants/Internal_1_21.java +++ b/MC_1_21/src/main/java/su/nightexpress/excellentenchants/Internal_1_21.java @@ -346,8 +346,6 @@ public class Internal_1_21 implements EnchantNMS { ServerPlayer entity = craftPlayer.getHandle(); ClientboundAnimatePacket packet = new ClientboundAnimatePacket(entity, id); craftPlayer.getHandle().connection.send(packet); - - player.spigot().sendMessage(); } @Override diff --git a/NMS/pom.xml b/NMS/pom.xml index 709ce04..9761642 100644 --- a/NMS/pom.xml +++ b/NMS/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 4.2.1 + 4.2.2 4.0.0 @@ -34,7 +34,7 @@ su.nightexpress.excellentenchants API - 4.2.1 + 4.2.2 diff --git a/pom.xml b/pom.xml index d9852b3..25a624c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ su.nightexpress.excellentenchants ExcellentEnchants pom - 4.2.1 + 4.2.2 API Core