diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index 3ab37010b..9e5c4b3f8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -3,7 +3,11 @@ package net.momirealms.craftengine.bukkit.item.listener; import io.papermc.paper.event.block.CompostItemEvent; import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.item.BukkitCustomItem; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; @@ -41,15 +45,18 @@ import org.bukkit.event.enchantment.EnchantItemEvent; import org.bukkit.event.enchantment.PrepareItemEnchantEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.inventory.EnchantingInventory; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -444,11 +451,34 @@ public class ItemEventListener implements Listener { } @EventHandler(ignoreCancelled = true) - public void onDragItem(InventoryClickEvent event) { -// Player player = (Player) event.getWhoClicked(); -// plugin.scheduler().sync().runLater(() -> { -// System.out.println(1); -// player.updateInventory(); -// }, 1); + public void onInventoryClick(InventoryClickEvent event) { + if (!(event.getInventory() instanceof EnchantingInventory inventory)) return; + if (!(event.getWhoClicked() instanceof Player player)) return; + ItemStack lazuli = inventory.getSecondary(); + if (lazuli != null) return; + ItemStack item = inventory.getItem(); + if (item == null) return; + Item wrapped = this.plugin.itemManager().wrap(item); + if (wrapped == null) return; + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isEmpty()) return; + BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); + if (customItem.clientItem() == FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getLiteralObject())) return; + BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + if (serverPlayer == null) return; + this.plugin.scheduler().sync().runDelayed(() -> { + Object container = FastNMS.INSTANCE.field$Player$containerMenu(serverPlayer.serverPlayer()); + if (!CoreReflections.clazz$EnchantmentMenu.isInstance(container)) return; + Object secondSlotItem = FastNMS.INSTANCE.method$Slot$getItem(FastNMS.INSTANCE.method$AbstractContainerMenu$getSlot(container, 1)); + if (secondSlotItem == null || FastNMS.INSTANCE.method$ItemStack$isEmpty(secondSlotItem)) return; + Object[] dataSlots = FastNMS.INSTANCE.field$AbstractContainerMenu$dataSlots(container).toArray(); + List packets = new ArrayList<>(dataSlots.length); + for (int i = 0; i < dataSlots.length; i++) { + Object dataSlot = dataSlots[i]; + int data = FastNMS.INSTANCE.method$DataSlot$get(dataSlot); + packets.add(FastNMS.INSTANCE.constructor$ClientboundContainerSetDataPacket(FastNMS.INSTANCE.field$AbstractContainerMenu$containerId(container), i, data)); + } + serverPlayer.sendPackets(packets, false); + }); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 4ec65e03f..9db9963f1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -17,6 +17,7 @@ import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.entity.projectile.BukkitProjectileManager; +import net.momirealms.craftengine.bukkit.item.BukkitCustomItem; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index af3fd9355..65b944856 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -3308,4 +3308,11 @@ public final class CoreReflections { public static final Field field$FireBlock$igniteOdds = requireNonNull( ReflectionUtils.getDeclaredField(clazz$FireBlock, Object2IntMap.class, 0) ); + + public static final Class clazz$EnchantmentMenu = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.inventory.ContainerEnchantTable", + "world.inventory.EnchantmentMenu" + ) + ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 4b62d8f22..b7789dc4c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -28,7 +28,7 @@ import java.util.stream.Collectors; public abstract class AbstractFontManager implements FontManager { private final CraftEngine plugin; - // namespace:font font + // namespace:font font private final Map fonts = new HashMap<>(); // namespace:id emoji private final Map emojis = new HashMap<>(); diff --git a/gradle.properties b/gradle.properties index a17dc894c..5533dc3ae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67.12 +nms_helper_version=0.67.18 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23