Trade GUI without villager [problem]

Discussion in 'Plugin Development' started by ArthurMaker, Mar 16, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    ArthurMaker

    So yeah, I have these codes and one problem with them: when I trade something in the gui, I receive double amount. How do I solve this? I'm trying to solve it, but it is hard! D:

    Code:java
    1. package MiniGame.shop.utils;
    2.  
    3. import net.minecraft.server.v1_7_R1.MerchantRecipe;
    4.  
    5. import org.apache.commons.lang.builder.EqualsBuilder;
    6. import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftItemStack;
    7. import org.bukkit.inventory.ItemStack;
    8.  
    9. public class Offer
    10. {
    11. private ItemStack product;
    12. private ItemStack price;
    13. private boolean disabled;
    14.  
    15. public Offer(ItemStack price, ItemStack product)
    16. {
    17. this.product = product;
    18. this.price = price;
    19. this.disabled = false;
    20. }
    21.  
    22. public ItemStack getProduct() {
    23. return this.product;
    24. }
    25.  
    26. public void setProduct(ItemStack product) {
    27. this.product = product;
    28. }
    29.  
    30. public ItemStack getPrice() {
    31. return this.price;
    32. }
    33.  
    34. public void setPrice(ItemStack price) {
    35. this.price = price;
    36. }
    37.  
    38. public MerchantRecipe toMerchantRecipe() {
    39. MerchantRecipe recipe = new MerchantRecipe(CraftItemStack.asNMSCopy(this.price), CraftItemStack.asNMSCopy(this.product));
    40. if (this.disabled) {
    41. recipe.a(-7);
    42. }
    43. return recipe;
    44. }
    45.  
    46. public boolean equals(Object obj)
    47. {
    48. if (obj == null) {
    49. return false;
    50. }
    51. if (obj == this) {
    52. return true;
    53. }
    54.  
    55. if (obj.getClass() != getClass()) {
    56. return false;
    57. }
    58.  
    59. Offer offer = (Offer)obj;
    60. return new EqualsBuilder().append(this.product, offer.product).append(this.price, offer.price).append(this.disabled, offer.disabled).isEquals();
    61. }
    62.  
    63. public static Offer fromMerchantRecipe(MerchantRecipe recipe)
    64. {
    65. return new Offer(CraftItemStack.asBukkitCopy(recipe.getBuyItem3()), CraftItemStack.asBukkitCopy(recipe.getBuyItem1()));
    66. }
    67.  
    68. public boolean isDisabled()
    69. {
    70. return this.disabled;
    71. }
    72.  
    73. public void setDisabled(boolean disabled) {
    74. this.disabled = disabled;
    75. }
    76.  
    77. public void simplify() {
    78. int productAmount = this.product.getAmount();
    79. int priceAmount = this.price.getAmount();
    80.  
    81. int gcd = NumberUtils.greatestCommonDivisor(productAmount, priceAmount);
    82.  
    83. this.product.setAmount(productAmount / gcd);
    84. this.price.setAmount(priceAmount / gcd);
    85. }
    86.  
    87. private static class NumberUtils
    88. {
    89. @SuppressWarnings("unused")
    90. public static boolean isInRange(int min, int number, int max)
    91. {
    92. return (min <= number) && (max >= number);
    93. }
    94.  
    95. public static int greatestCommonDivisor(int a, int b) {
    96. if (b == 0) {
    97. return a;
    98. }
    99. return greatestCommonDivisor(b, a % b);
    100. }
    101. }
    102.  
    103. }


    Code:java
    1. package MiniGame.shop.utils;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.Collection;
    5. import java.util.HashMap;
    6.  
    7. import net.minecraft.server.v1_7_R1.MerchantRecipeList;
    8.  
    9. import org.bukkit.Material;
    10. import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventoryCustom;
    11. import org.bukkit.inventory.Inventory;
    12. import org.bukkit.inventory.ItemStack;
    13.  
    14. public class Offers extends ArrayList<Offer>
    15. {
    16. /**
    17.   *
    18.   */
    19. private static final long serialVersionUID = -6163449189236694660L;
    20.  
    21. public Offers()
    22. {
    23. }
    24.  
    25. public Offers(Collection<? extends Offer> c)
    26. {
    27. super(c);
    28. }
    29.  
    30. public Offers(int initialCapacity) {
    31. super(initialCapacity);
    32. }
    33.  
    34. @SuppressWarnings("unchecked")
    35. public MerchantRecipeList toMerchantRecipeList()
    36. {
    37. MerchantRecipeList list = new MerchantRecipeList();
    38. for (Offer offer : this) {
    39. list.add(offer.toMerchantRecipe());
    40. }
    41.  
    42. return list;
    43. }
    44.  
    45. public void update(Inventory inventory) {
    46. for (Offer offer : this)
    47. if (!inventory.containsAtLeast(offer.getProduct(), offer.getProduct().getAmount()))
    48. offer.setDisabled(false);
    49. else if (InventoryUtils.freeSpaceForItem(inventory, offer.getPrice()) <= 0)
    50. offer.setDisabled(true);
    51. else
    52. offer.setDisabled(false);
    53. }
    54.  
    55. public int findIndex(Offer offer)
    56. {
    57. int index = 0;
    58. for (Offer o : this) {
    59. if (o.equals(offer)) {
    60. return index;
    61. }
    62. index++;
    63. }
    64. return -1;
    65. }
    66.  
    67. private static class InventoryUtils
    68. {
    69. public static CraftInventoryCustom copyInventory(Inventory inventory)
    70. {
    71. CraftInventoryCustom copy = new CraftInventoryCustom(inventory.getHolder(), inventory.getSize(), inventory.getTitle());
    72.  
    73. copy.setMaxStackSize(inventory.getMaxStackSize());
    74. copy.setContents(inventory.getContents());
    75.  
    76. return copy;
    77. }
    78.  
    79. public static int freeSpaceForItem(Inventory inventory, ItemStack stack) {
    80. int freespace = 0;
    81.  
    82. for (ItemStack invstack : inventory) {
    83. if ((invstack == null) || (invstack.getType() == Material.AIR))
    84. freespace += stack.getMaxStackSize();
    85. else if (invstack.isSimilar(stack)) {
    86. freespace += stack.getMaxStackSize() - invstack.getAmount();
    87. }
    88. }
    89.  
    90. return freespace;
    91. }
    92.  
    93. @SuppressWarnings("unused")
    94. public static HashMap<Integer, ItemStack> testAdding(Inventory inventory, ItemStack[] items) {
    95. Inventory copy = copyInventory(inventory);
    96. return copy.addItem(items);
    97. }
    98. }
    99.  
    100. }


    Code:java
    1. package MiniGame.shop.utils;
    2.  
    3. import net.minecraft.server.v1_7_R1.EntityHuman;
    4. import net.minecraft.server.v1_7_R1.IMerchant;
    5. import net.minecraft.server.v1_7_R1.MerchantRecipe;
    6. import net.minecraft.server.v1_7_R1.MerchantRecipeList;
    7. import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.inventory.Inventory;
    10.  
    11. public class Trades
    12. implements IMerchant
    13. {
    14. private Player player;
    15. private Offers offers;
    16.  
    17. public Trades(Player trader, Offers offers)
    18. {
    19. this.player = trader;
    20. this.offers = offers;
    21. }
    22.  
    23. public void useOffer(Offer offer) {
    24. Inventory traderInventory = this.player.getPlayer().getInventory();
    25. traderInventory.removeItem(new org.bukkit.inventory.ItemStack[] { offer.getProduct() });
    26. traderInventory.addItem(new org.bukkit.inventory.ItemStack[] { offer.getPrice() });
    27. traderInventory.removeItem(new org.bukkit.inventory.ItemStack[] { offer.getProduct() });
    28. }
    29.  
    30. @Deprecated
    31. public void a(MerchantRecipe arg0)
    32. {
    33. Offer offer = Offer.fromMerchantRecipe(arg0);
    34. useOffer(offer);
    35. }
    36.  
    37. @Deprecated
    38. public void a_(EntityHuman arg0)
    39. {
    40. }
    41.  
    42. @Deprecated
    43. public void a_(net.minecraft.server.v1_7_R1.ItemStack arg0)
    44. {
    45. }
    46.  
    47. @Deprecated
    48. public MerchantRecipeList getOffers(EntityHuman arg0)
    49. {
    50. return this.offers.toMerchantRecipeList();
    51. }
    52.  
    53. @Deprecated
    54. public EntityHuman b()
    55. {
    56. return ((CraftPlayer)this.player).getHandle();
    57. }
    58.  
    59. public Player getPlayer(){
    60. return this.player;
    61. }
    62.  
    63. }


    Code:java
    1. package MiniGame.shop.utils;
    2.  
    3. import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
    4. import org.bukkit.entity.Player;
    5.  
    6. public class VTrader{
    7. @SuppressWarnings("deprecation")
    8. public static void openTrader(String traderName, Player player, Offers offers){
    9. Trades trader = new Trades(player, offers);
    10. player.updateInventory();
    11. ((CraftPlayer)player).getHandle().openTrade(trader, traderName);
    12. }
    13. }


    And to create a shop, I use this:

    Code:java
    1. package MiniGame.shop;
    2.  
    3. import org.bukkit.Material;
    4. import org.bukkit.entity.Player;
    5. import org.bukkit.inventory.ItemStack;
    6.  
    7. import MiniGame.shop.utils.Offer;
    8. import MiniGame.shop.utils.Offers;
    9. import MiniGame.shop.utils.VTrader;
    10.  
    11. public class Shop {
    12.  
    13. public Shop(Player player, String type){
    14. if(type.equalsIgnoreCase("misc")){
    15. Offers items = new Offers();
    16. items.add(new Offer(new ItemStack(Material.CLAY_BRICK), new ItemStack(Material.SANDSTONE, 4)));
    17. items.add(new Offer(new ItemStack(Material.CLAY_BRICK, 4), new ItemStack(Material.ENDER_STONE)));
    18. items.add(new Offer(new ItemStack(Material.CLAY_BRICK, 3), new ItemStack(Material.LADDER, 2)));
    19. items.add(new Offer(new ItemStack(Material.IRON_INGOT), new ItemStack(Material.WOOD_PICKAXE)));
    20. items.add(new Offer(new ItemStack(Material.IRON_INGOT, 3), new ItemStack(Material.IRON_PICKAXE)));
    21. items.add(new Offer(new ItemStack(Material.GOLD_INGOT), new ItemStack(Material.DIAMOND_PICKAXE)));
    22. VTrader.openTrader("Construção", player, items);
    23. }else if(type.equalsIgnoreCase("weapons")){
    24. Offers items = new Offers();
    25. items.add(new Offer(new ItemStack(Material.IRON_INGOT), new ItemStack(Material.WOOD_SWORD)));
    26. items.add(new Offer(new ItemStack(Material.IRON_INGOT, 2), new ItemStack(Material.STONE_SWORD)));
    27. items.add(new Offer(new ItemStack(Material.IRON_INGOT, 7), new ItemStack(Material.IRON_SWORD)));
    28. items.add(new Offer(new ItemStack(Material.IRON_INGOT, 3), new ItemStack(Material.TNT)));
    29. items.add(new Offer(new ItemStack(Material.GOLD_INGOT), new ItemStack(Material.FLINT_AND_STEEL)));
    30. VTrader.openTrader("Armamentos", player, items);
    31. }
    32. }
    33.  
    34. }


    The whole code works well, but when I trade something, I receive it with double amount.
    Anyone can help me?

    up!

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 7, 2016
  2. Offline

    Garris0n

    Bump once per 24 hours.

    What is that simplify() method for?
     
Thread Status:
Not open for further replies.

Share This Page