diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignBuy.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignBuy.java index 8b59f79f62b..ef6508c0987 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignBuy.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignBuy.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; +import net.ess3.api.events.SignTransactionEvent; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; import org.bukkit.inventory.ItemStack; @@ -45,6 +46,12 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri } charge.isAffordableFor(player); + final SignTransactionEvent signTransactionEvent = new SignTransactionEvent(sign, this, player, items.getItemStack(), SignTransactionEvent.TransactionType.BUY, charge.getMoney()); + + ess.getServer().getPluginManager().callEvent(signTransactionEvent); + if (signTransactionEvent.isCancelled()) { + return true; + } if (!items.pay(player)) { throw new ChargeException("inventoryFull"); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignSell.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignSell.java index 5841e2b6ee6..34b8a23ffa3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignSell.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignSell.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Trade; import com.earth2me.essentials.Trade.OverflowType; import com.earth2me.essentials.User; +import net.ess3.api.events.SignTransactionEvent; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; import org.bukkit.inventory.ItemStack; @@ -47,6 +48,13 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri } charge.isAffordableFor(player); + + final SignTransactionEvent signTransactionEvent = new SignTransactionEvent(sign, this, player, charge.getItemStack(), SignTransactionEvent.TransactionType.SELL, money.getMoney()); + ess.getServer().getPluginManager().callEvent(signTransactionEvent); + if (signTransactionEvent.isCancelled()) { + return false; + } + money.pay(player, OverflowType.DROP); charge.charge(player); Trade.log("Sign", "Sell", "Interact", username, charge, username, money, sign.getBlock().getLocation(), player.getMoney(), ess); diff --git a/Essentials/src/main/java/net/ess3/api/events/SignTransactionEvent.java b/Essentials/src/main/java/net/ess3/api/events/SignTransactionEvent.java new file mode 100644 index 00000000000..18dac137ad1 --- /dev/null +++ b/Essentials/src/main/java/net/ess3/api/events/SignTransactionEvent.java @@ -0,0 +1,79 @@ +package net.ess3.api.events; + +import com.earth2me.essentials.signs.EssentialsSign; +import net.ess3.api.IUser; +import org.bukkit.event.Cancellable; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.bukkit.event.HandlerList; + +import java.math.BigDecimal; + +/** + * Fired when a player either buys or sells from an Essentials sign + */ +public final class SignTransactionEvent extends SignInteractEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final ItemStack itemStack; + private final TransactionType transactionType; + private final BigDecimal transactionValue; + private boolean isCancelled = false; + + public SignTransactionEvent(EssentialsSign.ISign sign, EssentialsSign essSign, IUser user, ItemStack itemStack, TransactionType transactionType, BigDecimal transactionValue) { + super(sign, essSign, user); + this.itemStack = itemStack; + this.transactionType = transactionType; + this.transactionValue = transactionValue; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.isCancelled = cancelled; + } + + /** + * Gets the ItemStack that is about to be bought or sold in this transition. + * @return The ItemStack being bought or sold. + */ + public @NotNull ItemStack getItemStack() { + return itemStack.clone(); + } + + /** + * Gets the type of transaction, either buy or sell. + * @return The transaction type. + */ + public @NotNull TransactionType getTransactionType() { + return transactionType; + } + + /** + * Gets the value of the item being bought or sold. + * @return The item's value. + */ + public BigDecimal getTransactionValue() { + return transactionValue; + } + + /** + * The type of transaction for this sign transaction. + */ + public enum TransactionType { + BUY, + SELL + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +}