+ update event api

+ update command api
+ update nbt api
+ update menu api
This commit is contained in:
坏黑
2019-10-22 13:18:18 +08:00
parent 048eb12daf
commit baf2958535
17 changed files with 530 additions and 78 deletions

View File

@@ -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) {

View File

@@ -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);
}