From 398841454ef77aa3d5bb25d3cfe648cd43c92f47 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 15 Apr 2019 18:00:58 +0800 Subject: [PATCH] modified: src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackGUI.java new file: src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackInventory.java modified: src/main/java/cat/nyaa/nyaautils/lootprotect/LootProtectListener.java --- .../extrabackpack/ExtraBackpackGUI.java | 372 ++++++++++++------ .../extrabackpack/ExtraBackpackInventory.java | 36 ++ .../lootprotect/LootProtectListener.java | 4 + src/main/resources/plugin.yml | 1 + 4 files changed, 291 insertions(+), 122 deletions(-) create mode 100644 src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackInventory.java diff --git a/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackGUI.java b/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackGUI.java index b30cb87..ce4e9e3 100644 --- a/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackGUI.java +++ b/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackGUI.java @@ -33,6 +33,7 @@ public class ExtraBackpackGUI implements InventoryHolder { private final RelationalDB database; private final UUID owner; private final Player opener; + private ExtraBackpackInventory extraBackpack; private static final Map opened = new HashMap<>(); private static final Map> lastState = new HashMap<>(); private int currentPage = 0; @@ -55,24 +56,171 @@ void open(int page) { throw new IllegalStateException(); } Player currentOpener; + //如果有玩家已经打开背包 if ((currentOpener = opened.putIfAbsent(owner, opener)) != null) { if (!currentOpener.equals(opener) && opener.getOpenInventory().getTopInventory().getHolder() instanceof ExtraBackpackGUI) { + //如果是管理员打开普通玩家背包 if (opener.hasPermission("nu.bp.admin") && !currentOpener.hasPermission("nu.bp.admin")) { Inventory inventory = currentOpener.getOpenInventory().getTopInventory(); if (inventory.getHolder() instanceof ExtraBackpackGUI) { - ((ExtraBackpackGUI) inventory.getHolder()).saveAll(inventory); +// ((ExtraBackpackGUI) inventory.getHolder()).saveAll(inventory); + ((ExtraBackpackGUI) inventory.getHolder()).saveAll(extraBackpack); ((ExtraBackpackGUI) inventory.getHolder()).close(); } new Message(I18n.format("user.backpack.force_opened")).send(currentOpener); } else { + //如果不是管理员打开普通玩家背包,通知已经打开 new Message(I18n.format("user.backpack.already_opened")).send(opener); return; } } } currentPage = page; - String ownerId = owner.toString(); maxLine = plugin.cfg.bp_default_lines; + extraBackpack = getInventory(owner); + if (extraBackpack == null) { + new Message(I18n.format("user.backpack.disabled")).send(opener); + opened.remove(owner); + return; + } +// int pageCount = (int) Math.ceil(maxLine / 6.0); +// List view = lines.stream().skip(page * 6).limit(6).collect(Collectors.toList()); +// int viewSize = view.size(); +// if (viewSize == 0) { +// new Message(I18n.format("user.backpack.invalid_page", page, pageCount)).send(opener); +// opened.remove(owner); +// return; +// } +// int size = viewSize * 9; +// ItemStack[] itemStacks = view.stream().flatMap(l -> l.getItemStacks().stream()).toArray(ItemStack[]::new); +// inventory.setContents(itemStacks); + saveScheduled.set(-1); +// opener.openInventory(inventory); + opener.openInventory(extraBackpack.inventories.get(currentPage)); + saveScheduled.set(0); + if (daemonTask == null) { + daemonTask = new BukkitRunnable() { + @Override + public void run() { + if (!opener.isOnline() || opener.getOpenInventory().getTopInventory().getHolder() != ExtraBackpackGUI.this) { + this.cancel(); + new IllegalAccessException().printStackTrace(); + saveScheduled.set(1); + saveAll(extraBackpack); + close(); + } + } + }.runTaskTimer(plugin, 0, 0); + } + } + + private void saveAll(ExtraBackpackInventory inventory) { + if (saveScheduled.getAndSet(0) != 1) { + return; + } + ExtraBackpackInventory clone = inventory.clone(); + List inventories = clone.inventories; + boolean saved = true; + Map exceptions = new LinkedHashMap<>(); + for (int i = 0; i < inventories.size(); i++) { + Inventory itemStacks = inventories.get(i); + for (int j = 0; j < itemStacks.getSize() / 9; j++) { + List line = Arrays.stream(itemStacks.getContents()).skip(j * 9).limit(9).collect(Collectors.toList()); + Pair currentResult = saveLine(i, j, line); + saved &= currentResult.getKey(); + if (currentResult.getValue() != null) { + exceptions.put(i, currentResult.getValue()); + } + } + if (!saved) { + close(); + new Message(I18n.format("user.backpack.error_saving")).send(opener); + for (Map.Entry entry : exceptions.entrySet()) { + plugin.getLogger().log(Level.SEVERE, "Failed to save backpack of " + owner.toString() + " line " + entry.getKey(), entry.getValue()); + } + } else { + tainted.set(false); + } + } + } + + private Pair saveLine(int page, int line, List itemStacks) { + String desiredState = ItemStackUtils.itemsToBase64(itemStacks); + int lineNo = page * 6 + line; + try { + if (!lastState.containsKey(owner) || !opened.containsKey(owner)) { + if (tainted.get()) { + String tainted = String.format("Tainted backpack of %s closed before saving when backpack opened by %s! Unsaved: %s", owner.toString(), opener.getUniqueId().toString(), desiredState); + Message message = new Message(tainted); + Bukkit.getOperators().forEach(op -> message.send(op, true)); + plugin.getLogger().severe(tainted); + new RuntimeException().printStackTrace(); + } else { + plugin.getLogger().warning(String.format("Trying to save a untainted closed backpack of %s opened by %s! Current: %s", owner.toString(), opener.getUniqueId().toString(), desiredState)); + new RuntimeException().printStackTrace(); + } + return Pair.of(false, null); + } + String lineLastState = lastState.get(owner).get(lineNo); + if (lineLastState.equals(desiredState)) return Pair.of(true, null); + try (Query query = database.queryTransactional(ExtraBackpackLine.class).whereEq("player_id", owner.toString()).whereEq("line_no", lineNo)) { + ExtraBackpackLine backpackLine = query.selectUniqueForUpdate(); + String lineCurrentState = backpackLine.getItems(); + if (!lineLastState.equals(lineCurrentState)) { + new Message(I18n.format("user.backpack.error_state", Bukkit.getOfflinePlayer(owner).getName(), lineNo, opener.getUniqueId())).broadcast(new Permission("nu.bp.admin")); + String errLine1 = String.format("%s's line %s (%d) changed when backpack opened by %s! ", owner.toString(), backpackLine.getId(), lineNo, opener.getUniqueId().toString()); + String errLine2 = String.format("Should be %s, actually %s, desired %s", lineLastState, lineCurrentState, desiredState); + Message message = new Message(errLine1 + "\n" + errLine2); + Bukkit.getOperators().forEach(op -> message.send(op, true)); + plugin.getLogger().warning(errLine1); + plugin.getLogger().warning(errLine2); + query.rollback(); + return Pair.of(false, null); + } + backpackLine.setItems(desiredState); + lastState.get(owner).set(backpackLine.getLineNo(), backpackLine.getItems()); + plugin.getLogger().finer(() -> String.format("Saving %d: %s (%s)", lineNo, line, backpackLine.getItems())); + query.update(backpackLine); + query.commit(); + } + return Pair.of(true, null); + } catch (Throwable throwable) { + new Message(I18n.format("user.backpack.unexpected_error", Bukkit.getOfflinePlayer(owner).getName(), lineNo, opener.getUniqueId())).broadcast(new Permission("nu.bp.admin")); + String errLine1 = String.format("%s's line %d errored saving when backpack opened by %s! ", owner.toString(), lineNo, opener.getUniqueId().toString()); + String errLine2 = String.format("Unsaved %s, error: %s", desiredState, throwable.getLocalizedMessage()); + Message message = new Message(errLine1 + "\n" + errLine2); + Bukkit.getOperators().forEach(op -> message.send(op, true)); + plugin.getLogger().warning(errLine1); + plugin.getLogger().warning(errLine2); + return Pair.of(false, throwable); + } + } + + private ExtraBackpackInventory getInventory(UUID owner) { + String ownerId = owner.toString(); + queryConfig(ownerId); + if (maxLine <= 0) { + return null; + } +// Inventory inventory = Bukkit.createInventory(this, size, I18n.format("user.backpack.title", Bukkit.getOfflinePlayer(owner).getName(), page, pageCount - 1)); + List lines; + lines = queryLines(owner, ownerId); + ExtraBackpackInventory inv = new ExtraBackpackInventory(this); + int pageCount = (int) Math.ceil(maxLine / 6.0); + inv.size = lines.size(); + for (int page = 0; page < pageCount; page++) { + long size = lines.stream().skip(page * 6).limit(6).count(); + String title = I18n.format("user.backpack.title", Bukkit.getOfflinePlayer(owner).getName(), page, pageCount - 1); + Inventory inventory = Bukkit.createInventory(this, (int) size * 9, title); + List view = lines.stream().skip(page * 6).limit(6).collect(Collectors.toList()); + ItemStack[] itemStacks = view.stream().flatMap(l -> l.getItemStacks().stream()).toArray(ItemStack[]::new); + inventory.setContents(itemStacks); + inv.inventories.add(page, inventory); + } + return inv; + } + + private ExtraBackpackConfig queryConfig(String ownerId) { try (Query query = database.queryTransactional(ExtraBackpackConfig.class).whereEq("player_id", ownerId)) { ExtraBackpackConfig cfg = query.selectUniqueForUpdate(); if (cfg != null) { @@ -85,12 +233,13 @@ void open(int page) { query.insert(cfg); query.commit(); } + return cfg; + } catch (Exception e) { + return null; } - if (maxLine <= 0) { - new Message(I18n.format("user.backpack.disabled")).send(opener); - opened.remove(owner); - return; - } + } + + private List queryLines(UUID owner, String ownerId) { List lines; try (Query query = database.queryTransactional(ExtraBackpackLine.class).whereEq("player_id", ownerId)) { lines = query.select(); @@ -110,35 +259,7 @@ void open(int page) { lastState.put(owner, lines.stream().map(ExtraBackpackLine::getItems).collect(Collectors.toList())); query.commit(); } - int pageCount = (int) Math.ceil(maxLine / 6.0); - List view = lines.stream().skip(page * 6).limit(6).collect(Collectors.toList()); - int viewSize = view.size(); - if (viewSize == 0) { - new Message(I18n.format("user.backpack.invalid_page", page, pageCount)).send(opener); - opened.remove(owner); - return; - } - int size = viewSize * 9; - Inventory inventory = Bukkit.createInventory(this, size, I18n.format("user.backpack.title", Bukkit.getOfflinePlayer(owner).getName(), page, pageCount - 1)); - ItemStack[] itemStacks = view.stream().flatMap(l -> l.getItemStacks().stream()).toArray(ItemStack[]::new); - inventory.setContents(itemStacks); - saveScheduled.set(-1); - opener.openInventory(inventory); - saveScheduled.set(0); - if (daemonTask == null) { - daemonTask = new BukkitRunnable() { - @Override - public void run() { - if (!opener.isOnline() || opener.getOpenInventory().getTopInventory().getHolder() != ExtraBackpackGUI.this) { - this.cancel(); - new IllegalAccessException().printStackTrace(); - saveScheduled.set(1); - saveAll(inventory); - close(); - } - } - }.runTaskTimer(plugin, 0, 0); - } + return lines; } void onInventoryClick(InventoryClickEvent event) { @@ -149,7 +270,7 @@ void onInventoryClick(InventoryClickEvent event) { tainted.set(false); return; } - if (!player.equals(opened.get(owner))){ + if (!player.equals(opened.get(owner))) { player.closeInventory(); event.setCancelled(true); tainted.set(false); @@ -162,14 +283,16 @@ void onInventoryClick(InventoryClickEvent event) { if (maxLine <= 6) return; event.setCancelled(true); saveScheduled.set(1); - saveAll(inventory); +// saveAll(inventory); + saveAll(extraBackpack); Bukkit.getScheduler().runTask(plugin, () -> this.open(prevPage())); return; } else if (event.isRightClick()) { if (maxLine <= 6) return; event.setCancelled(true); saveScheduled.set(1); - saveAll(inventory); +// saveAll(inventory); + saveAll(extraBackpack); Bukkit.getScheduler().runTask(plugin, () -> this.open(nextPage())); return; } @@ -197,93 +320,94 @@ void onInventoryClose(InventoryCloseEvent event) { if (opened.containsKey(owner) && saveScheduled.compareAndSet(0, 1)) { daemonTask.cancel(); Inventory inventory = event.getInventory(); - saveAll(inventory); +// saveAll(inventory); + saveAll(extraBackpack); opened.remove(owner); lastState.remove(owner); } } - private void saveAll(Inventory inventory) { - if (saveScheduled.getAndSet(0) != 1) { - return; - } - if (inventory.getHolder() != this) { - throw new IllegalArgumentException(); - } - boolean saved = true; - Map exceptions = new HashMap<>(); - synchronized (this) { - for (int i = 0; i < inventory.getSize() / 9; ++i) { - List line = Arrays.stream(inventory.getContents()).skip(i * 9).limit(9).collect(Collectors.toList()); - Pair currentResult = saveLine(i, line); - saved &= currentResult.getKey(); - if (currentResult.getValue() != null) { - exceptions.put(i, currentResult.getValue()); - } - } - if (!saved) { - close(); - new Message(I18n.format("user.backpack.error_saving")).send(opener); - for (Map.Entry entry : exceptions.entrySet()) { - plugin.getLogger().log(Level.SEVERE, "Failed to save backpack of " + owner.toString() + " line " + entry.getKey(), entry.getValue()); - } - } else { - tainted.set(false); - } - } - } +// private void saveAll(Inventory inventory) { +// if (saveScheduled.getAndSet(0) != 1) { +// return; +// } +// if (inventory.getHolder() != this) { +// throw new IllegalArgumentException(); +// } +// boolean saved = true; +// Map exceptions = new HashMap<>(); +// synchronized (this) { +// for (int i = 0; i < inventory.getSize() / 9; ++i) { +// List line = Arrays.stream(inventory.getContents()).skip(i * 9).limit(9).collect(Collectors.toList()); +// Pair currentResult = saveLine(i, line); +// saved &= currentResult.getKey(); +// if (currentResult.getValue() != null) { +// exceptions.put(i, currentResult.getValue()); +// } +// } +// if (!saved) { +// close(); +// new Message(I18n.format("user.backpack.error_saving")).send(opener); +// for (Map.Entry entry : exceptions.entrySet()) { +// plugin.getLogger().log(Level.SEVERE, "Failed to save backpack of " + owner.toString() + " line " + entry.getKey(), entry.getValue()); +// } +// } else { +// tainted.set(false); +// } +// } +// } - private Pair saveLine(int i, List line) { - String desiredState = ItemStackUtils.itemsToBase64(line); - int lineNo = currentPage * 6 + i; - try { - if (!lastState.containsKey(owner) || !opened.containsKey(owner)) { - if (tainted.get()) { - String tainted = String.format("Tainted backpack of %s closed before saving when backpack opened by %s! Unsaved: %s", owner.toString(), opener.getUniqueId().toString(), desiredState); - Message message = new Message(tainted); - Bukkit.getOperators().forEach(op -> message.send(op, true)); - plugin.getLogger().severe(tainted); - new RuntimeException().printStackTrace(); - } else { - plugin.getLogger().warning(String.format("Trying to save a untainted closed backpack of %s opened by %s! Current: %s", owner.toString(), opener.getUniqueId().toString(), desiredState)); - new RuntimeException().printStackTrace(); - } - return Pair.of(false, null); - } - String lineLastState = lastState.get(owner).get(lineNo); - if (lineLastState.equals(desiredState)) return Pair.of(true, null); - try (Query query = database.queryTransactional(ExtraBackpackLine.class).whereEq("player_id", owner.toString()).whereEq("line_no", lineNo)) { - ExtraBackpackLine backpackLine = query.selectUniqueForUpdate(); - String lineCurrentState = backpackLine.getItems(); - if (!lineLastState.equals(lineCurrentState)) { - new Message(I18n.format("user.backpack.error_state", Bukkit.getOfflinePlayer(owner).getName(), lineNo, opener.getUniqueId())).broadcast(new Permission("nu.bp.admin")); - String errLine1 = String.format("%s's line %s (%d) changed when backpack opened by %s! ", owner.toString(), backpackLine.getId(), lineNo, opener.getUniqueId().toString()); - String errLine2 = String.format("Should be %s, actually %s, desired %s", lineLastState, lineCurrentState, desiredState); - Message message = new Message(errLine1 + "\n" + errLine2); - Bukkit.getOperators().forEach(op -> message.send(op, true)); - plugin.getLogger().warning(errLine1); - plugin.getLogger().warning(errLine2); - query.rollback(); - return Pair.of(false, null); - } - backpackLine.setItems(desiredState); - lastState.get(owner).set(backpackLine.getLineNo(), backpackLine.getItems()); - plugin.getLogger().finer(() -> String.format("Saving %d: %s (%s)", lineNo, line, backpackLine.getItems())); - query.update(backpackLine); - query.commit(); - } - return Pair.of(true, null); - } catch (Throwable throwable) { - new Message(I18n.format("user.backpack.unexpected_error", Bukkit.getOfflinePlayer(owner).getName(), lineNo, opener.getUniqueId())).broadcast(new Permission("nu.bp.admin")); - String errLine1 = String.format("%s's line %d errored saving when backpack opened by %s! ", owner.toString(), lineNo, opener.getUniqueId().toString()); - String errLine2 = String.format("Unsaved %s, error: %s", desiredState, throwable.getLocalizedMessage()); - Message message = new Message(errLine1 + "\n" + errLine2); - Bukkit.getOperators().forEach(op -> message.send(op, true)); - plugin.getLogger().warning(errLine1); - plugin.getLogger().warning(errLine2); - return Pair.of(false, throwable); - } - } +// private Pair saveLine(int i, List line) { +// String desiredState = ItemStackUtils.itemsToBase64(line); +// int lineNo = currentPage * 6 + i; +// try { +// if (!lastState.containsKey(owner) || !opened.containsKey(owner)) { +// if (tainted.get()) { +// String tainted = String.format("Tainted backpack of %s closed before saving when backpack opened by %s! Unsaved: %s", owner.toString(), opener.getUniqueId().toString(), desiredState); +// Message message = new Message(tainted); +// Bukkit.getOperators().forEach(op -> message.send(op, true)); +// plugin.getLogger().severe(tainted); +// new RuntimeException().printStackTrace(); +// } else { +// plugin.getLogger().warning(String.format("Trying to save a untainted closed backpack of %s opened by %s! Current: %s", owner.toString(), opener.getUniqueId().toString(), desiredState)); +// new RuntimeException().printStackTrace(); +// } +// return Pair.of(false, null); +// } +// String lineLastState = lastState.get(owner).get(lineNo); +// if (lineLastState.equals(desiredState)) return Pair.of(true, null); +// try (Query query = database.queryTransactional(ExtraBackpackLine.class).whereEq("player_id", owner.toString()).whereEq("line_no", lineNo)) { +// ExtraBackpackLine backpackLine = query.selectUniqueForUpdate(); +// String lineCurrentState = backpackLine.getItems(); +// if (!lineLastState.equals(lineCurrentState)) { +// new Message(I18n.format("user.backpack.error_state", Bukkit.getOfflinePlayer(owner).getName(), lineNo, opener.getUniqueId())).broadcast(new Permission("nu.bp.admin")); +// String errLine1 = String.format("%s's line %s (%d) changed when backpack opened by %s! ", owner.toString(), backpackLine.getId(), lineNo, opener.getUniqueId().toString()); +// String errLine2 = String.format("Should be %s, actually %s, desired %s", lineLastState, lineCurrentState, desiredState); +// Message message = new Message(errLine1 + "\n" + errLine2); +// Bukkit.getOperators().forEach(op -> message.send(op, true)); +// plugin.getLogger().warning(errLine1); +// plugin.getLogger().warning(errLine2); +// query.rollback(); +// return Pair.of(false, null); +// } +// backpackLine.setItems(desiredState); +// lastState.get(owner).set(backpackLine.getLineNo(), backpackLine.getItems()); +// plugin.getLogger().finer(() -> String.format("Saving %d: %s (%s)", lineNo, line, backpackLine.getItems())); +// query.update(backpackLine); +// query.commit(); +// } +// return Pair.of(true, null); +// } catch (Throwable throwable) { +// new Message(I18n.format("user.backpack.unexpected_error", Bukkit.getOfflinePlayer(owner).getName(), lineNo, opener.getUniqueId())).broadcast(new Permission("nu.bp.admin")); +// String errLine1 = String.format("%s's line %d errored saving when backpack opened by %s! ", owner.toString(), lineNo, opener.getUniqueId().toString()); +// String errLine2 = String.format("Unsaved %s, error: %s", desiredState, throwable.getLocalizedMessage()); +// Message message = new Message(errLine1 + "\n" + errLine2); +// Bukkit.getOperators().forEach(op -> message.send(op, true)); +// plugin.getLogger().warning(errLine1); +// plugin.getLogger().warning(errLine2); +// return Pair.of(false, throwable); +// } +// } void onInventoryDrag(InventoryDragEvent event) { Inventory inventory = event.getInventory(); @@ -292,7 +416,10 @@ void onInventoryDrag(InventoryDragEvent event) { private void scheduleSaveAll(Inventory inventory) { saveScheduled.set(1); - Bukkit.getScheduler().runTask(plugin, () -> saveAll(inventory)); + Bukkit.getScheduler().runTask(plugin, () -> { +// saveAll(inventory); + saveAll(extraBackpack); + }); } private void close() { @@ -322,7 +449,8 @@ public static void closeAll() { Inventory inventory = view.getTopInventory(); if (inventory.getHolder() instanceof ExtraBackpackGUI) { ExtraBackpackGUI holder = (ExtraBackpackGUI) inventory.getHolder(); - holder.saveAll(inventory); +// holder.saveAll(inventory); + holder.saveAll(holder.extraBackpack); holder.close(); } } diff --git a/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackInventory.java b/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackInventory.java new file mode 100644 index 0000000..33bc572 --- /dev/null +++ b/src/main/java/cat/nyaa/nyaautils/extrabackpack/ExtraBackpackInventory.java @@ -0,0 +1,36 @@ +package cat.nyaa.nyaautils.extrabackpack; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; + +import java.util.LinkedList; +import java.util.List; + +public class ExtraBackpackInventory { + int size = 0; + List inventories; + OfflinePlayer owner; + InventoryHolder holder; + + ExtraBackpackInventory(InventoryHolder holder) { + inventories = new LinkedList<>(); + this.holder = holder; + } + + @Override + public ExtraBackpackInventory clone(){ + ExtraBackpackInventory clone = new ExtraBackpackInventory(holder); + clone.size = size; + clone.owner = owner; + boolean empty = inventories.isEmpty(); + for (Inventory inventory : inventories) { + Inventory inventory1 = Bukkit.createInventory(holder, inventory.getSize(), inventory.getTitle()); + inventory1.setContents(inventory.getContents()); + clone.inventories.add(inventory1); + } + return clone; + } +} + diff --git a/src/main/java/cat/nyaa/nyaautils/lootprotect/LootProtectListener.java b/src/main/java/cat/nyaa/nyaautils/lootprotect/LootProtectListener.java index 72733f6..03d9397 100644 --- a/src/main/java/cat/nyaa/nyaautils/lootprotect/LootProtectListener.java +++ b/src/main/java/cat/nyaa/nyaautils/lootprotect/LootProtectListener.java @@ -3,6 +3,7 @@ import cat.nyaa.nyaacore.database.DatabaseUtils; import cat.nyaa.nyaacore.database.keyvalue.KeyValueDB; import cat.nyaa.nyaautils.NyaaUtils; +import org.bukkit.Bukkit; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -10,6 +11,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; @@ -140,6 +142,8 @@ private static void giveExp(Player p, int amount) { } if (amount > 0) p.giveExp(amount); + PlayerExpChangeEvent event = new PlayerExpChangeEvent(p, amount); + Bukkit.getServer().getPluginManager().callEvent(event); } private static int compareByDamagePercentage(ItemStack a, ItemStack b) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e35369b..7386ec3 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -33,6 +33,7 @@ permissions: description: Add item as enchantment source default: op nu.launch: + description: Launch player into sky default: op nu.lootprotect: