From 87adbb477d5da476cf0647798c7157e1110bd19f Mon Sep 17 00:00:00 2001 From: Ali Moghnieh Date: Fri, 22 Jul 2016 23:56:26 +0100 Subject: [PATCH] Allow bulk buy/sell when sneaking. Resolves #65 --- .../src/com/earth2me/essentials/User.java | 14 ++++++++++ .../earth2me/essentials/signs/SignBuy.java | 26 +++++++++++++++++-- .../earth2me/essentials/signs/SignSell.java | 26 +++++++++++++++++-- 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index 07c8716e9..7908e01ef 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -19,6 +19,8 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -787,4 +789,16 @@ public class User extends UserData implements Comparable, IMessageRecipien this.afkMessage = message; } } + + /** + * Returns the {@link ItemStack} in the main hand or off-hand. If the main hand is empty then the offhand item is returned - also nullable. + */ + public ItemStack getItemInHand() { + if (ReflUtil.getNmsVersionObject().isLowerThan(ReflUtil.V1_9_R1)) { + return getBase().getInventory().getItemInHand(); + } else { + PlayerInventory inventory = getBase().getInventory(); + return inventory.getItemInMainHand() != null ? inventory.getItemInMainHand() : inventory.getItemInOffHand(); + } + } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignBuy.java b/Essentials/src/com/earth2me/essentials/signs/SignBuy.java index c2d51afe3..48e65849f 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignBuy.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignBuy.java @@ -6,6 +6,10 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; +import org.bukkit.inventory.ItemStack; + +import java.math.BigDecimal; + public class SignBuy extends EssentialsSign { public SignBuy() { @@ -21,8 +25,26 @@ public class SignBuy extends EssentialsSign { @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException, MaxMoneyException { - final Trade items = getTrade(sign, 1, 2, player, ess); - final Trade charge = getTrade(sign, 3, ess); + Trade items = getTrade(sign, 1, 2, player, ess); + Trade charge = getTrade(sign, 3, ess); + + // Check if the player is trying to buy in bulk. + if (player.getBase().isSneaking()) { + ItemStack heldItem = player.getItemInHand(); + if (items.getItemStack().isSimilar(heldItem)) { + int initialItemAmount = items.getItemStack().getAmount(); + int newItemAmount = heldItem.getAmount(); + ItemStack item = items.getItemStack(); + item.setAmount(newItemAmount); + items = new Trade(item, ess); + + BigDecimal chargeAmount = charge.getMoney(); + BigDecimal pricePerSingleItem = chargeAmount.divide(new BigDecimal(initialItemAmount)); + pricePerSingleItem = pricePerSingleItem.multiply(new BigDecimal(newItemAmount)); + charge = new Trade(pricePerSingleItem, ess); + } + } + charge.isAffordableFor(player); if (!items.pay(player)) { throw new ChargeException("Inventory full"); //TODO: TL diff --git a/Essentials/src/com/earth2me/essentials/signs/SignSell.java b/Essentials/src/com/earth2me/essentials/signs/SignSell.java index 55a17870f..ff8353793 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignSell.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignSell.java @@ -7,6 +7,10 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; +import org.bukkit.inventory.ItemStack; + +import java.math.BigDecimal; + public class SignSell extends EssentialsSign { public SignSell() { @@ -22,8 +26,26 @@ public class SignSell extends EssentialsSign { @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException, MaxMoneyException { - final Trade charge = getTrade(sign, 1, 2, player, ess); - final Trade money = getTrade(sign, 3, ess); + Trade charge = getTrade(sign, 1, 2, player, ess); + Trade money = getTrade(sign, 3, ess); + + // Check if the player is trying to sell in bulk. + if (player.getBase().isSneaking()) { + ItemStack heldItem = player.getItemInHand(); + if (charge.getItemStack().isSimilar(heldItem)) { + int initialItemAmount = charge.getItemStack().getAmount(); + int newItemAmount = heldItem.getAmount(); + ItemStack item = charge.getItemStack(); + item.setAmount(newItemAmount); + charge = new Trade(item, ess); + + BigDecimal chargeAmount = money.getMoney(); + BigDecimal pricePerSingleItem = chargeAmount.divide(new BigDecimal(initialItemAmount)); + pricePerSingleItem = pricePerSingleItem.multiply(new BigDecimal(newItemAmount)); + money = new Trade(pricePerSingleItem, ess); + } + } + charge.isAffordableFor(player); money.pay(player, OverflowType.DROP); charge.charge(player);