diff --git a/core/src/main/java/io/typst/bukkit/view/BottomClickEvent.java b/core/src/main/java/io/typst/bukkit/view/BottomClickEvent.java new file mode 100644 index 0000000..77d78eb --- /dev/null +++ b/core/src/main/java/io/typst/bukkit/view/BottomClickEvent.java @@ -0,0 +1,18 @@ +package io.typst.bukkit.view; + +import lombok.Data; +import lombok.With; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.inventory.ItemStack; + +@Data +@With +public class BottomClickEvent { + private final ChestView view; + private final Player player; + private final ClickType click; + private final ItemStack clickItem; + private final InventoryAction action; +} diff --git a/core/src/main/java/io/typst/bukkit/view/BukkitView.java b/core/src/main/java/io/typst/bukkit/view/BukkitView.java index 8850f83..fd67591 100644 --- a/core/src/main/java/io/typst/bukkit/view/BukkitView.java +++ b/core/src/main/java/io/typst/bukkit/view/BukkitView.java @@ -106,6 +106,20 @@ public void onClick(InventoryClickEvent e) { // update user input items Player p = (Player) e.getWhoClicked(); ViewControl viewControl = view.getContents().getControls().get(e.getRawSlot()); + + // bottom inventory click event + if (e.getView().getBottomInventory() == e.getClickedInventory()) { + ViewAction action; + try { + action = view.getOnBottomClick().apply(new BottomClickEvent(view, p, e.getClick(), e.getCurrentItem(), e.getAction())); + } catch (Exception ex) { + plugin.getLogger().log(Level.WARNING, ex, () -> "Error on bottom inventory click!"); + // To block after actions + action = ViewAction.CLOSE; + } + handleAction(p, holder, action); + } + // Cancel if tried to move the control items switch (e.getClick()) { case LEFT: diff --git a/core/src/main/java/io/typst/bukkit/view/ChestView.java b/core/src/main/java/io/typst/bukkit/view/ChestView.java index 756e729..5589f6d 100644 --- a/core/src/main/java/io/typst/bukkit/view/ChestView.java +++ b/core/src/main/java/io/typst/bukkit/view/ChestView.java @@ -25,6 +25,8 @@ public class ChestView { @Builder.Default Function onClose = e -> ViewAction.NOTHING; @Builder.Default + Function onBottomClick = e -> ViewAction.NOTHING; + @Builder.Default Consumer onContentsUpdate = e -> { }; @Builder.Default diff --git a/core/src/main/java/io/typst/bukkit/view/item/BukkitItem.java b/core/src/main/java/io/typst/bukkit/view/item/BukkitItem.java index b8860a0..1f26e44 100644 --- a/core/src/main/java/io/typst/bukkit/view/item/BukkitItem.java +++ b/core/src/main/java/io/typst/bukkit/view/item/BukkitItem.java @@ -4,6 +4,7 @@ import lombok.With; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -19,9 +20,10 @@ public class BukkitItem { private final List lore; private final Integer modelData; private final Map enchants; + private final Set flags; public static BukkitItem ofJust(Material material) { - return of(material, 1, (short) 0, "", Collections.emptyList(), 0, Collections.emptyMap()); + return of(material, 1, (short) 0, "", Collections.emptyList(), 0, Collections.emptyMap(), Collections.emptySet()); } public static BukkitItem from(ItemStack item) { @@ -33,7 +35,8 @@ public static BukkitItem from(ItemStack item) { meta != null && meta.hasDisplayName() ? meta.getDisplayName() : "", meta != null && meta.hasLore() ? meta.getLore() : Collections.emptyList(), meta != null && meta.hasCustomModelData() ? meta.getCustomModelData() : 0, - meta != null && meta.hasEnchants() ? meta.getEnchants() : Collections.emptyMap() + meta != null && meta.hasEnchants() ? meta.getEnchants() : Collections.emptyMap(), + meta != null && meta.getItemFlags().isEmpty() ? meta.getItemFlags() : Collections.emptySet() ); } @@ -64,6 +67,9 @@ public void update(ItemStack x) { if (getModelData() != 0) { meta.setCustomModelData(getModelData()); } + if (!getFlags().isEmpty()) { + meta.addItemFlags(getFlags().toArray(new ItemFlag[0])); + } x.setItemMeta(meta); } for (Map.Entry pair : getEnchants().entrySet()) {