+ update event api
+ update command api + update nbt api + update menu api
This commit is contained in:
parent
048eb12daf
commit
baf2958535
@ -6,7 +6,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = 'me.skymc'
|
group = 'me.skymc'
|
||||||
version = '5.08'
|
version = '5.09'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 1.8
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 1.8
|
||||||
|
@ -1,46 +1,17 @@
|
|||||||
package io.izzel.taboolib.common.event;
|
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.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;
|
private Player player;
|
||||||
|
|
||||||
public PlayerJumpEvent(Player player) {
|
public PlayerJumpEvent(Player player) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HandlerList getHandlerList() {
|
|
||||||
return handlers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Player getPlayer() {
|
public Player getPlayer() {
|
||||||
return this.player;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -28,13 +28,12 @@ public class ListenerPlayerJump implements Listener {
|
|||||||
// 不在冷却
|
// 不在冷却
|
||||||
&& !cooldown.isCooldown(e.getPlayer().getName())) {
|
&& !cooldown.isCooldown(e.getPlayer().getName())) {
|
||||||
|
|
||||||
PlayerJumpEvent event = new PlayerJumpEvent(e.getPlayer()).call();
|
new PlayerJumpEvent(e.getPlayer()).call().ifCancelled(() -> {
|
||||||
if (event.isCancelled()) {
|
|
||||||
// 返回位置
|
// 返回位置
|
||||||
e.setTo(e.getFrom());
|
e.setTo(e.getFrom());
|
||||||
// 重置冷却
|
// 重置冷却
|
||||||
cooldown.reset(e.getPlayer().getName());
|
cooldown.reset(e.getPlayer().getName());
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,9 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
|||||||
sender.sendMessage(getEmptyLine());
|
sender.sendMessage(getEmptyLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract public String getCommandTitle();
|
public String getCommandTitle() {
|
||||||
|
return "§e§l----- §6§l" + registerCommand.getPlugin().getName() + " Commands §e§l-----";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] args) {
|
public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] args) {
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,12 @@
|
|||||||
package io.izzel.taboolib.module.lite;
|
package io.izzel.taboolib.module.lite;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author 坏黑
|
* @Author 坏黑
|
||||||
@ -14,23 +14,25 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public enum SimpleEquip {
|
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 EquipmentSlot bukkit;
|
||||||
|
private String nms;
|
||||||
private int slot;
|
private int slot;
|
||||||
|
|
||||||
SimpleEquip(EquipmentSlot bukkit, int slot) {
|
SimpleEquip(EquipmentSlot bukkit, String nms, int slot) {
|
||||||
this.bukkit = bukkit;
|
this.bukkit = bukkit;
|
||||||
|
this.nms = nms;
|
||||||
this.slot = slot;
|
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) {
|
public static SimpleEquip fromBukkit(EquipmentSlot bukkit) {
|
||||||
return Arrays.stream(values()).filter(tEquipment -> tEquipment.bukkit == bukkit).findFirst().orElse(null);
|
return Arrays.stream(values()).filter(tEquipment -> tEquipment.bukkit == bukkit).findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map<SimpleEquip, ItemStack> getItems(Player player) {
|
public static Map<SimpleEquip, ItemStack> getItems(Player player) {
|
||||||
Map<SimpleEquip, ItemStack> map = Maps.newHashMap();
|
return Arrays.stream(values()).collect(Collectors.toMap(equipment -> equipment, equipment -> equipment.getItem(player), (a, b) -> b));
|
||||||
for (SimpleEquip equipment : values()) {
|
|
||||||
map.put(equipment, equipment.getItem(player));
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// *********************************
|
// *********************************
|
||||||
@ -72,6 +74,10 @@ public enum SimpleEquip {
|
|||||||
return bukkit;
|
return bukkit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getNMS() {
|
||||||
|
return nms;
|
||||||
|
}
|
||||||
|
|
||||||
public int getSlot() {
|
public int getSlot() {
|
||||||
return slot;
|
return slot;
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,19 @@
|
|||||||
package io.izzel.taboolib.module.nms;
|
package io.izzel.taboolib.module.nms;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import io.izzel.taboolib.module.inject.TInject;
|
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.NBTCompound;
|
||||||
|
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author 坏黑
|
* @Author 坏黑
|
||||||
* @Since 2018-11-09 14:38
|
* @Since 2018-11-09 14:38
|
||||||
@ -47,4 +54,17 @@ public abstract class NMS {
|
|||||||
public ItemStack saveNBT(ItemStack itemStack, NBTCompound compound) {
|
public ItemStack saveNBT(ItemStack itemStack, NBTCompound compound) {
|
||||||
return _NBT(itemStack, 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);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
package io.izzel.taboolib.module.nms;
|
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.Version;
|
||||||
import io.izzel.taboolib.module.lite.SimpleReflection;
|
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.NBTCompound;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
||||||
|
import io.izzel.taboolib.module.nms.nbt.NBTOperation;
|
||||||
import io.izzel.taboolib.module.packet.TPacketHandler;
|
import io.izzel.taboolib.module.packet.TPacketHandler;
|
||||||
import net.minecraft.server.v1_12_R1.ChatMessageType;
|
import net.minecraft.server.v1_12_R1.ChatMessageType;
|
||||||
import net.minecraft.server.v1_12_R1.EntityVillager;
|
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.lang.reflect.Field;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author 坏黑
|
* @Author 坏黑
|
||||||
@ -235,6 +240,29 @@ public class NMSImpl extends NMS {
|
|||||||
return new NBTCompound();
|
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) {
|
private Object toNBTBase(io.izzel.taboolib.module.nms.nbt.NBTBase base) {
|
||||||
switch (base.getType().getId()) {
|
switch (base.getType().getId()) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -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 +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,13 @@
|
|||||||
package io.izzel.taboolib.module.nms.nbt;
|
package io.izzel.taboolib.module.nms.nbt;
|
||||||
|
|
||||||
|
import io.izzel.taboolib.TabooLib;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author 坏黑
|
* @Author 坏黑
|
||||||
@ -9,6 +15,7 @@ import java.util.Objects;
|
|||||||
*/
|
*/
|
||||||
public class NBTBase {
|
public class NBTBase {
|
||||||
|
|
||||||
|
protected static final Pattern SHORT_PATTERN = Pattern.compile("\\d+s");
|
||||||
protected NBTType type;
|
protected NBTType type;
|
||||||
protected Object data;
|
protected Object data;
|
||||||
|
|
||||||
@ -115,6 +122,65 @@ public class NBTBase {
|
|||||||
return type;
|
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
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) {
|
if (this == o) {
|
||||||
|
@ -49,11 +49,37 @@ public class NBTCompound extends NBTBase implements Map<String, NBTBase> {
|
|||||||
return value.get(key);
|
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
|
@Override
|
||||||
public NBTBase put(String key, NBTBase value) {
|
public NBTBase put(String key, NBTBase value) {
|
||||||
return this.value.put(key, 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
|
@Override
|
||||||
public NBTBase remove(Object key) {
|
public NBTBase remove(Object key) {
|
||||||
return value.remove(key);
|
return value.remove(key);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,10 +7,18 @@ import java.security.NoSuchAlgorithmException;
|
|||||||
|
|
||||||
public class Strings {
|
public class Strings {
|
||||||
|
|
||||||
|
public static boolean nonBlack(String var) {
|
||||||
|
return !isBlank(var);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isBlank(String var) {
|
public static boolean isBlank(String var) {
|
||||||
return var == null || var.trim().isEmpty();
|
return var == null || var.trim().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean nonEmpty(CharSequence var) {
|
||||||
|
return !isEmpty(var);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isEmpty(CharSequence var) {
|
public static boolean isEmpty(CharSequence var) {
|
||||||
return var == null || var.length() == 0;
|
return var == null || var.length() == 0;
|
||||||
}
|
}
|
||||||
@ -90,13 +98,13 @@ public class Strings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String removeSign(String str) {
|
private static String removeSign(String str) {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuilder builder = new StringBuilder();
|
||||||
for (char item : str.toCharArray()) {
|
for (char item : str.toCharArray()) {
|
||||||
if (charReg(item)){
|
if (charReg(item)){
|
||||||
sb.append(item);
|
builder.append(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean charReg(char charValue) {
|
private static boolean charReg(char charValue) {
|
||||||
|
@ -2,13 +2,13 @@ package io.izzel.taboolib.util.item;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import io.izzel.taboolib.Version;
|
import io.izzel.taboolib.Version;
|
||||||
|
import io.izzel.taboolib.module.lite.SimpleEquip;
|
||||||
import io.izzel.taboolib.module.lite.SimpleI18n;
|
import io.izzel.taboolib.module.lite.SimpleI18n;
|
||||||
import io.izzel.taboolib.module.locale.TLocale;
|
import io.izzel.taboolib.module.locale.TLocale;
|
||||||
import io.izzel.taboolib.module.nms.NMS;
|
import io.izzel.taboolib.module.nms.NMS;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTBase;
|
import io.izzel.taboolib.module.nms.nbt.NBTBase;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
|
import io.izzel.taboolib.module.nms.nbt.NBTCompound;
|
||||||
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
import io.izzel.taboolib.module.nms.nbt.NBTList;
|
||||||
import io.izzel.taboolib.util.lite.Numbers;
|
|
||||||
import org.bukkit.Color;
|
import org.bukkit.Color;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
@ -26,6 +26,8 @@ import org.bukkit.util.NumberConversions;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author 坏黑
|
* @Author 坏黑
|
||||||
@ -48,6 +50,10 @@ public class Items {
|
|||||||
return item == null || item.getType().equals(Material.AIR);
|
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) {
|
public static boolean hasLore(ItemStack i, String a) {
|
||||||
return hasLore(i) && i.getItemMeta().getLore().toString().contains(a);
|
return hasLore(i) && i.getItemMeta().getLore().toString().contains(a);
|
||||||
}
|
}
|
||||||
@ -210,11 +216,11 @@ public class Items {
|
|||||||
return section.getItemStack("bukkit");
|
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();
|
ItemMeta meta = item.getItemMeta();
|
||||||
// 展示名
|
// 展示名
|
||||||
@ -272,18 +278,7 @@ public class Items {
|
|||||||
NBTCompound nbt = NMS.handle().loadNBT(item);
|
NBTCompound nbt = NMS.handle().loadNBT(item);
|
||||||
// 物品标签
|
// 物品标签
|
||||||
if (section.contains("nbt")) {
|
if (section.contains("nbt")) {
|
||||||
for (String name : section.getConfigurationSection("nbt").getKeys(false)) {
|
NBTBase.translateSection(nbt, section.getConfigurationSection("nbt"));
|
||||||
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)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 物品属性
|
// 物品属性
|
||||||
if (section.contains("attributes")) {
|
if (section.contains("attributes")) {
|
||||||
@ -292,6 +287,7 @@ public class Items {
|
|||||||
for (String name : section.getConfigurationSection("attributes." + hand).getKeys(false)) {
|
for (String name : section.getConfigurationSection("attributes." + hand).getKeys(false)) {
|
||||||
if (asAttribute(name) != null) {
|
if (asAttribute(name) != null) {
|
||||||
try {
|
try {
|
||||||
|
UUID uuid = UUID.randomUUID();
|
||||||
NBTCompound a = new NBTCompound();
|
NBTCompound a = new NBTCompound();
|
||||||
String num = section.getString("attributes." + hand + "." + name);
|
String num = section.getString("attributes." + hand + "." + name);
|
||||||
if (num.endsWith("%")) {
|
if (num.endsWith("%")) {
|
||||||
@ -302,11 +298,11 @@ public class Items {
|
|||||||
a.put("Operation", new NBTBase(0));
|
a.put("Operation", new NBTBase(0));
|
||||||
}
|
}
|
||||||
a.put("AttributeName", new NBTBase(asAttribute(name)));
|
a.put("AttributeName", new NBTBase(asAttribute(name)));
|
||||||
a.put("UUIDMost", new NBTBase(Numbers.getRandom().nextInt(Integer.MAX_VALUE)));
|
a.put("UUIDMost", new NBTBase(uuid.getMostSignificantBits()));
|
||||||
a.put("UUIDLeast", new NBTBase(Numbers.getRandom().nextInt(Integer.MAX_VALUE)));
|
a.put("UUIDLeast", new NBTBase(uuid.getLeastSignificantBits()));
|
||||||
a.put("Name", new NBTBase(asAttribute(name)));
|
a.put("Name", new NBTBase(asAttribute(name)));
|
||||||
if (!hand.equals("all")) {
|
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);
|
attr.add(a);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
package io.izzel.taboolib.util.item.inventory;
|
package io.izzel.taboolib.util.item.inventory;
|
||||||
|
|
||||||
|
import io.izzel.taboolib.TabooLib;
|
||||||
import io.izzel.taboolib.module.inject.TListener;
|
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.Bukkit;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.Item;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
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.PlayerDropItemEvent;
|
||||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||||
import org.bukkit.event.server.PluginDisableEvent;
|
import org.bukkit.event.server.PluginDisableEvent;
|
||||||
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ -22,43 +28,68 @@ import java.util.Optional;
|
|||||||
class ClickListener implements Listener {
|
class ClickListener implements Listener {
|
||||||
|
|
||||||
@EventHandler
|
@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);
|
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
|
@EventHandler
|
||||||
public void onClick(InventoryClickEvent e) {
|
public void e(InventoryClickEvent e) {
|
||||||
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
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()))) {
|
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);
|
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()))));
|
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
|
@EventHandler
|
||||||
public void onDrag(InventoryDragEvent e) {
|
public void e(InventoryDragEvent e) {
|
||||||
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
||||||
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getClickTask()).ifPresent(t -> t.run(new ClickEvent(ClickType.DRAG, e, ' ')));
|
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getClickTask()).ifPresent(t -> t.run(new ClickEvent(ClickType.DRAG, e, ' ')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onDrag(InventoryCloseEvent e) {
|
public void e(InventoryCloseEvent e) {
|
||||||
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
if (e.getInventory().getHolder() instanceof MenuHolder) {
|
||||||
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getCloseTask()).ifPresent(t -> t.run(e));
|
Optional.ofNullable(((MenuHolder) e.getInventory().getHolder()).getBuilder().getCloseTask()).ifPresent(t -> t.run(e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onDrop(PlayerDropItemEvent e) {
|
public void e(PlayerDropItemEvent e) {
|
||||||
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand()) {
|
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand() && !e.getItemDrop().hasMetadata("internal-drop")) {
|
||||||
e.setCancelled(true);
|
e.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@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()) {
|
if (e.getPlayer().getOpenInventory().getTopInventory().getHolder() instanceof MenuHolder && ((MenuHolder) e.getPlayer().getOpenInventory().getTopInventory().getHolder()).getBuilder().isLockHand()) {
|
||||||
e.setCancelled(true);
|
e.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,10 @@ import java.util.stream.IntStream;
|
|||||||
*/
|
*/
|
||||||
public class Vectors {
|
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) {
|
public static Item itemDrop(Player player, ItemStack itemStack, double bulletSpread, double radius) {
|
||||||
Location location = player.getLocation().add(0.0D, 1.5D, 0.0D);
|
Location location = player.getLocation().add(0.0D, 1.5D, 0.0D);
|
||||||
Item item = player.getWorld().dropItem(location, itemStack);
|
Item item = player.getWorld().dropItem(location, itemStack);
|
||||||
|
Loading…
Reference in New Issue
Block a user