diff --git a/src/main/java/de/iani/treasurechest/ChestInventoryListener.java b/src/main/java/de/iani/treasurechest/ChestInventoryListener.java index 1430370..1932721 100644 --- a/src/main/java/de/iani/treasurechest/ChestInventoryListener.java +++ b/src/main/java/de/iani/treasurechest/ChestInventoryListener.java @@ -1,11 +1,13 @@ package de.iani.treasurechest; +import de.iani.treasurechest.PlayerTreasureChestContent.LoadState; +import de.iani.treasurechest.database.DatabaseTreasureChestItem; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.logging.Level; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Sound; @@ -26,13 +28,10 @@ import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; -import de.iani.treasurechest.PlayerTreasureChestContent.LoadState; -import de.iani.treasurechest.database.DatabaseTreasureChestItem; - public class ChestInventoryListener implements Listener { private TreasureChest plugin; - HashMap openInventories = new HashMap(); + HashMap openInventories = new HashMap<>(); public ChestInventoryListener(TreasureChest plugin) { this.plugin = plugin; @@ -140,11 +139,18 @@ TreasureChestItem selectedItem = content.getItem(entryId); if (selectedItem != null) { ItemStack[] priceList = selectedItem.getPriceItems(); - int priceCount = priceList == null ? 0 : priceList.length; + int priceMoney = Math.max(selectedItem.getPriceMoney(), 0); + TreasurePayoutEvent payoutEvent = new TreasurePayoutEvent(player, priceList == null || priceList.length == 0 ? Collections.emptyList() : Arrays.asList(priceList), priceMoney); + plugin.getServer().getPluginManager().callEvent(payoutEvent); + if (payoutEvent.isCancelled()) { + return; + } + + int priceCount = payoutEvent.getItems().size(); if (priceCount > 0) { ItemStack[] temp = new ItemStack[priceCount]; for (int i = 0; i < priceCount; i++) { - temp[i] = priceList[i].clone(); + temp[i] = payoutEvent.getItems().get(i).clone(); } if (!clonedPlayerInventory.addItem(temp).isEmpty()) { plugin.sendMessage(player, "Du hast nicht genĂ¼gend Platz in deinem Inventar!", true); @@ -164,10 +170,10 @@ if (priceCount > 0) { ItemStack[] temp = new ItemStack[priceCount]; for (int i = 0; i < priceCount; i++) { - temp[i] = priceList[i].clone(); + temp[i] = payoutEvent.getItems().get(i).clone(); } player.getInventory().addItem(temp); - for (ItemStack stack : priceList) { + for (ItemStack stack : payoutEvent.getItems()) { StringBuilder t = new StringBuilder(" "); if (stack.getAmount() > 1) { t.append(stack.getAmount()).append(" "); @@ -186,9 +192,10 @@ plugin.sendMessage(player, t.toString()); } } - if (selectedItem.getPriceMoney() > 0) { - plugin.giveMoney(player, selectedItem.getPriceMoney()); - plugin.sendMessage(player, " " + plugin.formatMoney(selectedItem.getPriceMoney())); + int money = payoutEvent.getMoney(); + if (money > 0) { + plugin.giveMoney(player, money); + plugin.sendMessage(player, " " + plugin.formatMoney(money)); } player.playSound(event.getWhoClicked().getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1f, 1f); diff --git a/src/main/java/de/iani/treasurechest/TreasureChest.java b/src/main/java/de/iani/treasurechest/TreasureChest.java index dba43ba..bed9ec1 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChest.java +++ b/src/main/java/de/iani/treasurechest/TreasureChest.java @@ -1,21 +1,5 @@ package de.iani.treasurechest; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Random; -import java.util.UUID; -import java.util.logging.Level; - -import org.bukkit.*; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; - import de.iani.playerUUIDCache.CachedPlayer; import de.iani.playerUUIDCache.PlayerUUIDCache; import de.iani.treasurechest.PlayerTreasureChestContent.LoadState; @@ -24,7 +8,26 @@ import de.iani.treasurechest.database.TreasureChestDatabase; import de.iani.treasurechest.worker.WorkEntry; import de.iani.treasurechest.worker.WorkerThread; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Random; +import java.util.UUID; +import java.util.logging.Level; import net.milkbowl.vault.economy.Economy; +import org.bukkit.ChatColor; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; public class TreasureChest extends JavaPlugin implements TreasureChestAPI { private TreasureChestData data; @@ -266,7 +269,6 @@ if (hasEconomy) { try { economy.depositPlayer(player, amount); - Bukkit.getPluginManager().callEvent(new TreasureChestMoneyTransactionEvent(player.getUniqueId(), System.currentTimeMillis(), amount)); } catch (Throwable e) { getLogger().log(Level.SEVERE, "Error paying money", e); } diff --git a/src/main/java/de/iani/treasurechest/TreasureChestMoneyTransactionEvent.java b/src/main/java/de/iani/treasurechest/TreasureChestMoneyTransactionEvent.java deleted file mode 100644 index 44e9d8a..0000000 --- a/src/main/java/de/iani/treasurechest/TreasureChestMoneyTransactionEvent.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.iani.treasurechest; - -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - -import java.util.UUID; - -public class TreasureChestMoneyTransactionEvent extends Event { - - private static final HandlerList handlers = new HandlerList(); - - private UUID player; - private long timestamp; - private double amount; - - public TreasureChestMoneyTransactionEvent(UUID player, long timestamp, double amount) { - this.player = player; - this.timestamp = timestamp; - this.amount = amount; - } - - public UUID getPlayer() { - return player; - } - - public long getTimestamp() { - return timestamp; - } - - public double getAmount() { - return amount; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } -} diff --git a/src/main/java/de/iani/treasurechest/TreasurePayoutEvent.java b/src/main/java/de/iani/treasurechest/TreasurePayoutEvent.java new file mode 100644 index 0000000..6e79600 --- /dev/null +++ b/src/main/java/de/iani/treasurechest/TreasurePayoutEvent.java @@ -0,0 +1,63 @@ +package de.iani.treasurechest; + +import com.google.common.base.Preconditions; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.bukkit.inventory.ItemStack; + +public class TreasurePayoutEvent extends PlayerEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + + private final List items; + private int money; + private boolean cancelled; + + public TreasurePayoutEvent(Player player, List items, int money) { + super(player); + Preconditions.checkArgument(money >= 0, "money may not be negative"); + this.items = new ArrayList<>(); + if (items != null) { + for (ItemStack stack : items) { + this.items.add(new ItemStack(stack)); + } + } + this.money = money; + } + + public List getItems() { + return items; + } + + public int getMoney() { + return money; + } + + public void setMoney(int money) { + Preconditions.checkArgument(money >= 0, "money may not be negative"); + this.money = money; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +}