TabooLib/src/main/scala/io/izzel/taboolib/util/item/inventory/ClickListener.java

133 lines
5.3 KiB
Java

package io.izzel.taboolib.util.item.inventory;
import io.izzel.taboolib.TabooLib;
import io.izzel.taboolib.module.inject.TListener;
import io.izzel.taboolib.util.item.Items;
import io.izzel.taboolib.util.lite.Vectors;
import org.bukkit.Bukkit;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.metadata.FixedMetadataValue;
/**
* @Author 坏黑
* @Since 2019-05-21 18:16
*/
@TListener
class ClickListener implements Listener {
@EventHandler
public void e(PluginDisableEvent e) {
Bukkit.getOnlinePlayers().stream().filter(player -> MenuHolder.get(player.getOpenInventory().getTopInventory()) != null).forEach(HumanEntity::closeInventory);
}
@EventHandler
public void e(InventoryOpenEvent e) {
MenuBuilder builder = MenuHolder.get(e.getInventory());
if (builder != null) {
Bukkit.getScheduler().runTaskLater(TabooLib.getPlugin(), () -> {
try {
builder.getBuildTask().run(e.getInventory());
} catch (Throwable t) {
t.printStackTrace();
}
}, 1);
Bukkit.getScheduler().runTaskLaterAsynchronously(TabooLib.getPlugin(), () -> {
try {
builder.getBuildTaskAsync().run(e.getInventory());
} catch (Throwable t) {
t.printStackTrace();
}
}, 1);
}
}
@EventHandler
public void e(InventoryClickEvent e) {
MenuBuilder builder = MenuHolder.get(e.getInventory());
if (builder != null) {
// lock hand
if (builder.isLockHand() && (e.getRawSlot() - e.getInventory().getSize() - 27 == e.getWhoClicked().getInventory().getHeldItemSlot() || (e.getClick() == org.bukkit.event.inventory.ClickType.NUMBER_KEY && e.getHotbarButton() == e.getWhoClicked().getInventory().getHeldItemSlot()))) {
e.setCancelled(true);
}
try {
builder.getClickTask().run(new ClickEvent(ClickType.CLICK, e, builder.getSlot(e.getRawSlot())));
} catch (Throwable t) {
t.printStackTrace();
}
// drop on empty area
if (!e.isCancelled() && Items.nonNull(e.getCurrentItem()) && e.getClick() == org.bukkit.event.inventory.ClickType.DROP) {
Item item = Vectors.itemDrop((Player) e.getWhoClicked(), e.getCurrentItem());
item.setPickupDelay(20);
item.setMetadata("internal-drop", new FixedMetadataValue(TabooLib.getPlugin(), true));
PlayerDropItemEvent event = new PlayerDropItemEvent((Player) e.getWhoClicked(), item);
if (event.isCancelled()) {
event.getItemDrop().remove();
} else {
e.setCurrentItem(null);
}
}
// drop by keyboard
else if (!e.isCancelled() && Items.nonNull(e.getCursor()) && e.getRawSlot() == -999) {
Item item = Vectors.itemDrop((Player) e.getWhoClicked(), e.getCursor());
item.setPickupDelay(20);
item.setMetadata("internal-drop", new FixedMetadataValue(TabooLib.getPlugin(), true));
PlayerDropItemEvent event = new PlayerDropItemEvent((Player) e.getWhoClicked(), item);
if (event.isCancelled()) {
event.getItemDrop().remove();
} else {
e.getView().setCursor(null);
}
}
}
}
@EventHandler
public void e(InventoryDragEvent e) {
MenuBuilder builder = MenuHolder.get(e.getInventory());
if (builder != null) {
try {
builder.getClickTask().run(new ClickEvent(ClickType.DRAG, e, ' '));
} catch (Throwable t) {
t.printStackTrace();
}
}
}
@EventHandler
public void e(InventoryCloseEvent e) {
MenuBuilder builder = MenuHolder.get(e.getInventory());
if (builder != null) {
try {
builder.getCloseTask().run(e);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
@EventHandler
public void e(PlayerDropItemEvent e) {
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand() && !e.getItemDrop().hasMetadata("internal-drop")) {
e.setCancelled(true);
}
}
@EventHandler
public void e(PlayerItemHeldEvent e) {
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand()) {
e.setCancelled(true);
}
}
}