+ update event api
+ update command api + update nbt api + update menu api
This commit is contained in:
@@ -2,13 +2,13 @@ package io.izzel.taboolib.util.item;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import io.izzel.taboolib.Version;
|
||||
import io.izzel.taboolib.module.lite.SimpleEquip;
|
||||
import io.izzel.taboolib.module.lite.SimpleI18n;
|
||||
import io.izzel.taboolib.module.locale.TLocale;
|
||||
import io.izzel.taboolib.module.nms.NMS;
|
||||
import io.izzel.taboolib.module.nms.nbt.NBTBase;
|
||||
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
|
||||
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
||||
import io.izzel.taboolib.util.lite.Numbers;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
@@ -26,6 +26,8 @@ import org.bukkit.util.NumberConversions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
@@ -48,6 +50,10 @@ public class Items {
|
||||
return item == null || item.getType().equals(Material.AIR);
|
||||
}
|
||||
|
||||
public static boolean nonNull(ItemStack item) {
|
||||
return !isNull(item);
|
||||
}
|
||||
|
||||
public static boolean hasLore(ItemStack i, String a) {
|
||||
return hasLore(i) && i.getItemMeta().getLore().toString().contains(a);
|
||||
}
|
||||
@@ -210,11 +216,11 @@ public class Items {
|
||||
return section.getItemStack("bukkit");
|
||||
}
|
||||
// 材质
|
||||
ItemStack item = new ItemStack(asMaterial(section.getString("material")));
|
||||
ItemStack item = new ItemStack(asMaterial(section.contains("material") ? section.getString("material") : section.getString("type")));
|
||||
// 数量
|
||||
item.setAmount(section.contains("amount") ? section.getInt("amount") : 1);
|
||||
item.setAmount(section.contains("amount") ? section.getInt("amount") : section.getInt("count", 1));
|
||||
// 耐久
|
||||
item.setDurability((short) section.getInt("data"));
|
||||
item.setDurability((short) (section.contains("data") ? section.getInt("data") : section.getInt("damage")));
|
||||
// 元数据
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
// 展示名
|
||||
@@ -272,18 +278,7 @@ public class Items {
|
||||
NBTCompound nbt = NMS.handle().loadNBT(item);
|
||||
// 物品标签
|
||||
if (section.contains("nbt")) {
|
||||
for (String name : section.getConfigurationSection("nbt").getKeys(false)) {
|
||||
Object obj = section.get("nbt." + name);
|
||||
if (obj instanceof String) {
|
||||
nbt.put(name, new NBTBase(obj.toString()));
|
||||
} else if (obj instanceof Double) {
|
||||
nbt.put(name, new NBTBase(NumberConversions.toDouble(obj)));
|
||||
} else if (obj instanceof Integer) {
|
||||
nbt.put(name, new NBTBase(NumberConversions.toInt(obj)));
|
||||
} else if (obj instanceof Long) {
|
||||
nbt.put(name, new NBTBase(NumberConversions.toLong(obj)));
|
||||
}
|
||||
}
|
||||
NBTBase.translateSection(nbt, section.getConfigurationSection("nbt"));
|
||||
}
|
||||
// 物品属性
|
||||
if (section.contains("attributes")) {
|
||||
@@ -292,6 +287,7 @@ public class Items {
|
||||
for (String name : section.getConfigurationSection("attributes." + hand).getKeys(false)) {
|
||||
if (asAttribute(name) != null) {
|
||||
try {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
NBTCompound a = new NBTCompound();
|
||||
String num = section.getString("attributes." + hand + "." + name);
|
||||
if (num.endsWith("%")) {
|
||||
@@ -302,11 +298,11 @@ public class Items {
|
||||
a.put("Operation", new NBTBase(0));
|
||||
}
|
||||
a.put("AttributeName", new NBTBase(asAttribute(name)));
|
||||
a.put("UUIDMost", new NBTBase(Numbers.getRandom().nextInt(Integer.MAX_VALUE)));
|
||||
a.put("UUIDLeast", new NBTBase(Numbers.getRandom().nextInt(Integer.MAX_VALUE)));
|
||||
a.put("UUIDMost", new NBTBase(uuid.getMostSignificantBits()));
|
||||
a.put("UUIDLeast", new NBTBase(uuid.getLeastSignificantBits()));
|
||||
a.put("Name", new NBTBase(asAttribute(name)));
|
||||
if (!hand.equals("all")) {
|
||||
a.put("Slot", new NBTBase(hand));
|
||||
Optional.ofNullable(SimpleEquip.fromNMS(hand)).ifPresent(e -> a.put("Slot", new NBTBase(e.getNMS())));
|
||||
}
|
||||
attr.add(a);
|
||||
} catch (Exception ignored) {
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
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;
|
||||
@@ -11,6 +16,7 @@ import org.bukkit.event.inventory.InventoryDragEvent;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||
import org.bukkit.event.server.PluginDisableEvent;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -22,43 +28,68 @@ import java.util.Optional;
|
||||
class ClickListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onDisable(PluginDisableEvent e) {
|
||||
public void e(PluginDisableEvent e) {
|
||||
Bukkit.getOnlinePlayers().stream().filter(player -> player.getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && e.getPlugin().equals(((MenuHolder) player.getOpenInventory().getTopInventory().getHolder()).getBuilder().getPlugin())).forEach(HumanEntity::closeInventory);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onClick(InventoryClickEvent e) {
|
||||
public void e(InventoryClickEvent e) {
|
||||
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
||||
// lock hand
|
||||
if (((MenuHolder) e.getInventory().getHolder()).getBuilder().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);
|
||||
}
|
||||
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getClickTask()).ifPresent(t -> t.run(new ClickEvent(ClickType.CLICK, e, ((MenuHolder) e.getInventory().getHolder()).getBuilder().getSlot(e.getRawSlot()))));
|
||||
// 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 onDrag(InventoryDragEvent e) {
|
||||
public void e(InventoryDragEvent e) {
|
||||
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
||||
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getClickTask()).ifPresent(t -> t.run(new ClickEvent(ClickType.DRAG, e, ' ')));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDrag(InventoryCloseEvent e) {
|
||||
public void e(InventoryCloseEvent e) {
|
||||
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
||||
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getCloseTask()).ifPresent(t -> t.run(e));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDrop(PlayerDropItemEvent e) {
|
||||
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand()) {
|
||||
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 onHeld(PlayerItemHeldEvent e) {
|
||||
public void e(PlayerItemHeldEvent e) {
|
||||
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand()) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user