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