+ 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

@ -6,7 +6,7 @@ plugins {
}
group = 'me.skymc'
version = '5.08'
version = '5.09'
sourceCompatibility = 1.8
targetCompatibility = 1.8

View File

@ -1,46 +1,17 @@
package io.izzel.taboolib.common.event;
import org.bukkit.Bukkit;
import io.izzel.taboolib.module.event.EventCancellable;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class PlayerJumpEvent extends Event implements Cancellable {
public class PlayerJumpEvent extends EventCancellable<PlayerJumpEvent> {
private static final HandlerList handlers = new HandlerList();
private boolean isCancelled;
private Player player;
public PlayerJumpEvent(Player player) {
this.player = player;
}
public static HandlerList getHandlerList() {
return handlers;
}
public Player getPlayer() {
return this.player;
}
public PlayerJumpEvent call() {
Bukkit.getPluginManager().callEvent(this);
return this;
}
@Override
public boolean isCancelled() {
return this.isCancelled;
}
@Override
public void setCancelled(boolean e) {
this.isCancelled = e;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}

View File

@ -28,13 +28,12 @@ public class ListenerPlayerJump implements Listener {
// 不在冷却
&& !cooldown.isCooldown(e.getPlayer().getName())) {
PlayerJumpEvent event = new PlayerJumpEvent(e.getPlayer()).call();
if (event.isCancelled()) {
new PlayerJumpEvent(e.getPlayer()).call().ifCancelled(() -> {
// 返回位置
e.setTo(e.getFrom());
// 重置冷却
cooldown.reset(e.getPlayer().getName());
}
});
}
}
}

View File

@ -110,7 +110,9 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
sender.sendMessage(getEmptyLine());
}
abstract public String getCommandTitle();
public String getCommandTitle() {
return "§e§l----- §6§l" + registerCommand.getPlugin().getName() + " Commands §e§l-----";
}
@Override
public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] args) {

View File

@ -0,0 +1,53 @@
package io.izzel.taboolib.module.event;
import org.bukkit.event.Cancellable;
/**
* @Author sky
* @Since 2019-10-22 10:41
*/
public abstract class EventCancellable<T extends EventCancellable> extends EventNormal implements Cancellable {
private boolean cancelled;
public T nonCancelled(Runnable runnable) {
if (nonCancelled()) {
try {
runnable.run();
} catch (Throwable t) {
t.printStackTrace();
}
}
return (T) this;
}
public T ifCancelled(Runnable runnable) {
if (isCancelled()) {
try {
runnable.run();
} catch (Throwable t) {
t.printStackTrace();
}
}
return (T) this;
}
@Override
public T call() {
return (T) super.call();
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
@Override
public boolean isCancelled() {
return cancelled;
}
public boolean nonCancelled() {
return !cancelled;
}
}

View File

@ -0,0 +1,47 @@
package io.izzel.taboolib.module.event;
import io.izzel.taboolib.util.Ref;
import io.izzel.taboolib.util.Reflection;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import java.lang.reflect.Field;
/**
* @Author sky
* @Since 2019-10-22 10:25
*/
public abstract class EventNormal<T extends EventNormal> extends Event {
protected static final HandlerList handlers = new HandlerList();
protected static HandlerList getHandlerList() {
return handlers;
}
public T call() {
try {
Bukkit.getPluginManager().callEvent(this);
} catch (Throwable t) {
t.printStackTrace();
}
return (T) this;
}
public T async(boolean value) {
try {
Field asyncField = Reflection.getField(Event.class, true, "async");
Ref.forcedAccess(asyncField);
asyncField.setBoolean(this, value);
} catch (Throwable t) {
t.printStackTrace();
}
return (T) this;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}

View File

@ -1,12 +1,12 @@
package io.izzel.taboolib.module.lite;
import com.google.common.collect.Maps;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author 坏黑
@ -14,23 +14,25 @@ import java.util.Map;
*/
public enum SimpleEquip {
HAND(EquipmentSlot.HAND, -1),
HAND(EquipmentSlot.HAND, "mainhand", -1),
OFF_HAND(EquipmentSlot.OFF_HAND, 40),
OFF_HAND(EquipmentSlot.OFF_HAND, "offhand", 40),
FEET(EquipmentSlot.FEET, 36),
FEET(EquipmentSlot.FEET, "feet", 36),
LEGS(EquipmentSlot.LEGS, 37),
LEGS(EquipmentSlot.LEGS, "legs", 37),
CHEST(EquipmentSlot.CHEST, 38),
CHEST(EquipmentSlot.CHEST, "chest", 38),
HEAD(EquipmentSlot.HEAD, 39);
HEAD(EquipmentSlot.HEAD, "head", 39);
private EquipmentSlot bukkit;
private String nms;
private int slot;
SimpleEquip(EquipmentSlot bukkit, int slot) {
SimpleEquip(EquipmentSlot bukkit, String nms, int slot) {
this.bukkit = bukkit;
this.nms = nms;
this.slot = slot;
}
@ -50,16 +52,16 @@ public enum SimpleEquip {
}
}
public static SimpleEquip fromNMS(String nms) {
return Arrays.stream(values()).filter(tEquipment -> tEquipment.nms.equalsIgnoreCase(nms)).findFirst().orElse(null);
}
public static SimpleEquip fromBukkit(EquipmentSlot bukkit) {
return Arrays.stream(values()).filter(tEquipment -> tEquipment.bukkit == bukkit).findFirst().orElse(null);
}
public static Map<SimpleEquip, ItemStack> getItems(Player player) {
Map<SimpleEquip, ItemStack> map = Maps.newHashMap();
for (SimpleEquip equipment : values()) {
map.put(equipment, equipment.getItem(player));
}
return map;
return Arrays.stream(values()).collect(Collectors.toMap(equipment -> equipment, equipment -> equipment.getItem(player), (a, b) -> b));
}
// *********************************
@ -72,6 +74,10 @@ public enum SimpleEquip {
return bukkit;
}
public String getNMS() {
return nms;
}
public int getSlot() {
return slot;
}

View File

@ -1,12 +1,19 @@
package io.izzel.taboolib.module.nms;
import com.google.common.collect.Lists;
import io.izzel.taboolib.module.inject.TInject;
import io.izzel.taboolib.module.nms.nbt.NBTAttribute;
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
import io.izzel.taboolib.module.nms.nbt.NBTList;
import org.bukkit.Particle;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
* @Author 坏黑
* @Since 2018-11-09 14:38
@ -47,4 +54,17 @@ public abstract class NMS {
public ItemStack saveNBT(ItemStack itemStack, NBTCompound compound) {
return _NBT(itemStack, compound);
}
public List<NBTAttribute> getAttribute(ItemStack item) {
NBTCompound nbt = loadNBT(item);
return !nbt.containsKey("AttributeModifiers") ? Lists.newCopyOnWriteArrayList() : nbt.get("AttributeModifiers").asList().stream().map(element -> NBTAttribute.fromNBT(element.asCompound())).collect(Collectors.toCollection(CopyOnWriteArrayList::new));
}
public ItemStack setAttribute(ItemStack item, List<NBTAttribute> attributes) {
NBTCompound nbt = loadNBT(item);
nbt.put("AttributeModifiers", attributes.stream().map(NBTAttribute::toNBT).collect(Collectors.toCollection(NBTList::new)));
return saveNBT(item, nbt);
}
abstract public List<NBTAttribute> getBaseAttribute(ItemStack item);
}

View File

@ -1,9 +1,13 @@
package io.izzel.taboolib.module.nms;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import io.izzel.taboolib.Version;
import io.izzel.taboolib.module.lite.SimpleReflection;
import io.izzel.taboolib.module.nms.nbt.NBTAttribute;
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
import io.izzel.taboolib.module.nms.nbt.NBTList;
import io.izzel.taboolib.module.nms.nbt.NBTOperation;
import io.izzel.taboolib.module.packet.TPacketHandler;
import net.minecraft.server.v1_12_R1.ChatMessageType;
import net.minecraft.server.v1_12_R1.EntityVillager;
@ -28,6 +32,7 @@ import org.bukkit.inventory.meta.PotionMeta;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* @Author 坏黑
@ -235,6 +240,29 @@ public class NMSImpl extends NMS {
return new NBTCompound();
}
@Override
public List<NBTAttribute> getBaseAttribute(ItemStack item) {
List<NBTAttribute> list = Lists.newArrayList();
Object nmsItem = CraftItemStack.asNMSCopy(item);
Object attr;
if (Version.isAfter(Version.v1_9)) {
attr = ((net.minecraft.server.v1_12_R1.ItemStack) nmsItem).getItem().a(net.minecraft.server.v1_12_R1.EnumItemSlot.MAINHAND);
} else {
attr = ((net.minecraft.server.v1_8_R3.ItemStack) nmsItem).getItem().i();
}
((Multimap) attr).forEach((k, v) -> {
Object nbt = net.minecraft.server.v1_12_R1.GenericAttributes.a((net.minecraft.server.v1_12_R1.AttributeModifier) v);
list.add(new NBTAttribute(
new UUID(((NBTTagCompound) nbt).getLong("UUIDMost"), ((NBTTagCompound) nbt).getLong("UUIDLeast")),
String.valueOf(k),
((NBTTagCompound) nbt).getString("Name"),
((NBTTagCompound) nbt).getDouble("Amount"),
NBTOperation.fromIndex(((NBTTagCompound) nbt).getInt("Operation"))
));
});
return list;
}
private Object toNBTBase(io.izzel.taboolib.module.nms.nbt.NBTBase base) {
switch (base.getType().getId()) {
case 1:

View File

@ -0,0 +1,168 @@
package io.izzel.taboolib.module.nms.nbt;
import io.izzel.taboolib.module.lite.SimpleEquip;
import io.izzel.taboolib.util.item.Items;
import java.util.Objects;
import java.util.UUID;
/**
* @Author sky
* @Since 2019-10-22 11:38
*/
public class NBTAttribute {
private UUID id;
private String name;
private String description;
private double amount;
private SimpleEquip slot;
private NBTOperation operation;
public NBTAttribute(String name, String description, double amount, NBTOperation operation) {
this(UUID.randomUUID(), name, description, amount, null, operation);
}
public NBTAttribute(String name, String description, double amount, SimpleEquip slot, NBTOperation operation) {
this(UUID.randomUUID(), name, description, amount, slot, operation);
}
public NBTAttribute(UUID id, String name, String description, double amount, NBTOperation operation) {
this(id, name, description, amount, null, operation);
}
public NBTAttribute(UUID id, String name, String description, double amount, SimpleEquip slot, NBTOperation operation) {
this.id = id;
this.name = name;
this.description = description;
this.amount = amount;
this.slot = slot;
this.operation = operation;
}
public NBTCompound toNBT() {
NBTCompound nbt = new NBTCompound();
nbt.put("UUIDMost", new NBTBase(id.getMostSignificantBits()));
nbt.put("UUIDLeast", new NBTBase(id.getLeastSignificantBits()));
nbt.put("AttributeName", new NBTBase(name));
nbt.put("Name", new NBTBase(description));
nbt.put("Amount", new NBTBase(amount));
nbt.put("Operation", new NBTBase(operation.ordinal()));
if (slot != null) {
nbt.put("Slot", new NBTBase(slot.getNMS()));
}
return nbt;
}
public static NBTAttribute fromNBT(NBTCompound nbt) {
NBTAttribute attribute = new NBTAttribute(
new UUID(nbt.get("UUIDMost").asLong(), nbt.get("UUIDLeast").asLong()),
nbt.get("AttributeName").asString(),
nbt.get("Name").asString(),
nbt.get("Amount").asDouble(),
NBTOperation.fromIndex(nbt.get("Operation").asInt())
);
if (nbt.containsKey("Slot")) {
attribute.slot(SimpleEquip.fromNMS(nbt.get("Slot").asString()));
}
return attribute;
}
public static NBTAttribute create() {
return new NBTAttribute(Items.asAttribute("damage"), "TabooLib Modifiers", 0, NBTOperation.ADD_NUMBER);
}
// *********************************
//
// Getter and Setter
//
// *********************************
public UUID getId() {
return id;
}
public NBTAttribute id(UUID id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public NBTAttribute name(String name) {
this.name = name;
return this;
}
public String getDescription() {
return description;
}
public NBTAttribute description(String description) {
this.description = description;
return this;
}
public double getAmount() {
return amount;
}
public NBTAttribute amount(double amount) {
this.amount = amount;
return this;
}
public SimpleEquip getSlot() {
return slot;
}
public NBTAttribute slot(SimpleEquip slot) {
this.slot = slot;
return this;
}
public NBTOperation getOperation() {
return operation;
}
public NBTAttribute operation(NBTOperation operation) {
this.operation = operation;
return this;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof NBTAttribute)) {
return false;
}
NBTAttribute that = (NBTAttribute) o;
return Double.compare(that.getAmount(), getAmount()) == 0 &&
Objects.equals(getId(), that.getId()) &&
Objects.equals(getName(), that.getName()) &&
Objects.equals(getDescription(), that.getDescription()) &&
getSlot() == that.getSlot() &&
getOperation() == that.getOperation();
}
@Override
public int hashCode() {
return Objects.hash(getId(), getName(), getDescription(), getAmount(), getSlot(), getOperation());
}
@Override
public String toString() {
return "NBTAttribute{" +
"id=" + id +
", name='" + name + '\'' +
", description='" + description + '\'' +
", amount=" + amount +
", slot=" + slot +
", operation=" + operation +
'}';
}
}

View File

@ -1,7 +1,13 @@
package io.izzel.taboolib.module.nms.nbt;
import io.izzel.taboolib.TabooLib;
import org.bukkit.configuration.ConfigurationSection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;
/**
* @Author 坏黑
@ -9,6 +15,7 @@ import java.util.Objects;
*/
public class NBTBase {
protected static final Pattern SHORT_PATTERN = Pattern.compile("\\d+s");
protected NBTType type;
protected Object data;
@ -115,6 +122,65 @@ public class NBTBase {
return type;
}
public static NBTBase formNBTBase(Object obj) {
if (obj instanceof String) {
if (SHORT_PATTERN.matcher(obj.toString()).matches()) {
return formNBTBase(Short.valueOf(obj.toString().substring(0, obj.toString().length() - 1)));
}
return new NBTBase((String) obj);
} else if (obj instanceof Integer) {
return new NBTBase((int) obj);
} else if (obj instanceof Double) {
return new NBTBase((double) obj);
} else if (obj instanceof Float) {
return new NBTBase((float) obj);
} else if (obj instanceof Short) {
return new NBTBase((short) obj);
} else if (obj instanceof Long) {
return new NBTBase((long) obj);
} else if (obj instanceof Byte) {
return new NBTBase((byte) obj);
} else if (obj instanceof List) {
return translateList(new NBTList(), (List) obj);
} else if (obj instanceof Map) {
NBTCompound nbtCompound = new NBTCompound();
((Map) obj).forEach((key, value) -> nbtCompound.put(key.toString(), formNBTBase(value)));
return nbtCompound;
} else if (obj instanceof ConfigurationSection) {
NBTCompound nbtCompound = new NBTCompound();
((ConfigurationSection) obj).getValues(false).forEach((key, value) -> nbtCompound.put(key, formNBTBase(value)));
return nbtCompound;
}
return new NBTBase("error: " + obj);
}
public static NBTList translateList(NBTList nbtListBase, List list) {
for (Object obj : list) {
NBTBase base = formNBTBase(obj);
if (base == null) {
TabooLib.getLogger().warn("Invalid Type: " + obj + " [" + obj.getClass().getSimpleName() + "]");
continue;
}
nbtListBase.add(base);
}
return nbtListBase;
}
public static NBTCompound translateSection(NBTCompound nbt, ConfigurationSection section) {
for (String key : section.getKeys(false)) {
Object obj = section.get(key);
NBTBase base;
if (obj instanceof ConfigurationSection) {
base = translateSection(new NBTCompound(), section.getConfigurationSection(key));
} else if ((base = formNBTBase(obj)) == null) {
TabooLib.getLogger().warn("Invalid Type: " + obj + " [" + obj.getClass().getSimpleName() + "]");
continue;
}
nbt.put(key, base);
}
return nbt;
}
@Override
public boolean equals(Object o) {
if (this == o) {

View File

@ -49,11 +49,37 @@ public class NBTCompound extends NBTBase implements Map<String, NBTBase> {
return value.get(key);
}
public NBTBase getDeep(String key) {
NBTBase value = this;
for (String keyStr : key.split("\\.")) {
if ((value = value.asCompound().get(keyStr)) == null) {
return null;
}
}
return value;
}
@Override
public NBTBase put(String key, NBTBase value) {
return this.value.put(key, value);
}
public NBTBase putDeep(String key, NBTBase value) {
NBTBase compound = this, temp;
String[] keySplit = key.split("\\.");
for (String keyStr : keySplit) {
if (keyStr.equalsIgnoreCase(keySplit[keySplit.length - 1])) {
return ((NBTCompound) compound).put(keyStr, value);
}
if ((temp = compound.asCompound().get(keyStr)) == null) {
temp = new NBTCompound();
compound.asCompound().put(keyStr, temp);
}
compound = temp;
}
return null;
}
@Override
public NBTBase remove(Object key) {
return value.remove(key);

View File

@ -0,0 +1,27 @@
package io.izzel.taboolib.module.nms.nbt;
import io.izzel.taboolib.util.KV;
import org.bukkit.util.NumberConversions;
import java.util.Arrays;
/**
* @Author sky
* @Since 2019-10-22 12:06
*/
public enum NBTOperation {
ADD_NUMBER, ADD_SCALAR, MULTIPLY_SCALAR_1;
public static NBTOperation fromIndex(int index) {
return Arrays.stream(values()).filter(operation -> operation.ordinal() == index).findFirst().orElse(ADD_NUMBER);
}
public static KV<Double, NBTOperation> fromSimple(String in) {
if (in.endsWith("%")) {
return new KV(NumberConversions.toDouble(in.substring(0, in.length() - 1)), ADD_SCALAR);
} else {
return new KV(NumberConversions.toDouble(in), ADD_NUMBER);
}
}
}

View File

@ -7,10 +7,18 @@ import java.security.NoSuchAlgorithmException;
public class Strings {
public static boolean nonBlack(String var) {
return !isBlank(var);
}
public static boolean isBlank(String var) {
return var == null || var.trim().isEmpty();
}
public static boolean nonEmpty(CharSequence var) {
return !isEmpty(var);
}
public static boolean isEmpty(CharSequence var) {
return var == null || var.length() == 0;
}
@ -90,13 +98,13 @@ public class Strings {
}
private static String removeSign(String str) {
StringBuffer sb = new StringBuffer();
StringBuilder builder = new StringBuilder();
for (char item : str.toCharArray()) {
if (charReg(item)){
sb.append(item);
builder.append(item);
}
}
return sb.toString();
return builder.toString();
}
private static boolean charReg(char charValue) {

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

View File

@ -15,6 +15,10 @@ import java.util.stream.IntStream;
*/
public class Vectors {
public static Item itemDrop(Player player, ItemStack itemStack) {
return itemDrop(player, itemStack, 0.0, 0.4);
}
public static Item itemDrop(Player player, ItemStack itemStack, double bulletSpread, double radius) {
Location location = player.getLocation().add(0.0D, 1.5D, 0.0D);
Item item = player.getWorld().dropItem(location, itemStack);