Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.26 KB | None | 0 0
  1. package net.dubcraft.npcshop.listeners;
  2.  
  3. import com.google.common.collect.Lists;
  4. import net.dubcraft.npcshop.NPCShop;
  5. import net.dubcraft.npcshop.config.ShopCategory;
  6. import net.dubcraft.npcshop.config.ShopItem;
  7. import net.dubcraft.npcshop.config.ShopPage;
  8. import net.milkbowl.vault.economy.EconomyResponse;
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.ChatColor;
  11. import org.bukkit.Material;
  12. import org.bukkit.entity.Player;
  13. import org.bukkit.event.Event;
  14. import org.bukkit.event.EventHandler;
  15. import org.bukkit.event.Listener;
  16. import org.bukkit.event.inventory.InventoryClickEvent;
  17. import org.bukkit.event.inventory.InventoryCloseEvent;
  18. import org.bukkit.inventory.Inventory;
  19. import org.bukkit.inventory.ItemStack;
  20. import org.bukkit.inventory.meta.ItemMeta;
  21. import org.bukkit.scheduler.BukkitRunnable;
  22.  
  23. import java.util.*;
  24.  
  25. public class ShopInvListener implements Listener {
  26.  
  27.     private NPCShop plugin;
  28.  
  29.     public ShopInvListener(NPCShop plugin) {
  30.         this.plugin = plugin;
  31.     }
  32.  
  33.     private HashMap<UUID, ShopItem> buyingItem = new HashMap<>();
  34.     private HashMap<UUID, Integer> pages = new HashMap<>();
  35.  
  36.     @EventHandler
  37.     public void onBuySell(InventoryClickEvent event) {
  38.  
  39.         final Player player = (Player) event.getWhoClicked();
  40.  
  41.         if (event.getInventory() == null || event.getClickedInventory() == null)
  42.             return;
  43.  
  44.         if (!event.getClickedInventory().getTitle().startsWith("Shop =>"))
  45.             return;
  46.  
  47.         event.setResult(Event.Result.DENY);
  48.  
  49.         ItemStack item = event.getCurrentItem();
  50.  
  51.         if (item == null || item.getType() == Material.AIR)
  52.             return;
  53.  
  54.         if (item.getType() == Material.BARRIER) {
  55.             player.closeInventory();
  56.             return;
  57.         }
  58.  
  59.         if (item.getType() == Material.ARROW) {
  60.  
  61.             final ShopCategory cat = buyingItem.get(player.getUniqueId()).getOwner();
  62.  
  63.             player.closeInventory();
  64.  
  65.             new BukkitRunnable() {
  66.                 public void run() {
  67.                     player.openInventory(cat.create());
  68.                 }
  69.             }.runTaskLater(plugin, 1L);
  70.             return;
  71.         }
  72.  
  73.         Material type = event.getClickedInventory().getItem(4).getType();
  74.  
  75.         ItemStack val = new ItemStack(type);
  76.  
  77.         ItemMeta clickedMeta = item.getItemMeta();
  78.  
  79.         String display = ChatColor.stripColor(clickedMeta.getDisplayName());
  80.  
  81.         if (display.startsWith("Sell")) {
  82.  
  83.             if (item.getType() == Material.BUCKET) {
  84.  
  85.                 if (!buyingItem.get(player.getUniqueId()).isCanSell()) {
  86.                     player.sendMessage(plugin.getLocale().getCannotSell());
  87.                     return;
  88.                 }
  89.  
  90.                 int total = 0;
  91.                 int totalAmount = 0;
  92.  
  93.                 for (int i = 0; i < player.getInventory().getSize(); i++) {
  94.  
  95.                     ShopItem shopItem = buyingItem.get(player.getUniqueId());
  96.  
  97.                     ItemStack current = player.getInventory().getItem(i);
  98.  
  99.                     if (current == null || current.getType() == Material.AIR) {
  100.                         continue;
  101.                     }
  102.  
  103.                     int amount = current.getAmount();
  104.  
  105.                     if (current.getType().getId() != shopItem.getItemID()) {
  106.                         continue;
  107.                     }
  108.  
  109.                     if (current.getData().getData() != shopItem.getData()) {
  110.                         continue;
  111.                     }
  112.  
  113.                     player.getInventory().setItem(i, new ItemStack(Material.AIR));
  114.  
  115.                     total += (shopItem.getSellPrice() * amount);
  116.                     totalAmount += amount;
  117.  
  118.                     plugin.getEcon().depositPlayer(player, (shopItem.getSellPrice() * amount));
  119.                 }
  120.  
  121.                 player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getSellCompleted()).replace("%item%", buyingItem.get(player.getUniqueId()).getDisplayName())
  122.                         .replace("%amount%", String.valueOf(totalAmount))
  123.                         .replace("%price%", String.valueOf(total)));
  124.             } else {
  125.                 ShopItem sItem = buyingItem.get(player.getUniqueId());
  126.  
  127.                 if (!sItem.isCanSell()) {
  128.                     player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getCannotSell()));
  129.                     return;
  130.                 }
  131.  
  132.                 String amount = ChatColor.stripColor(clickedMeta.getLore().get(0)).split(" ")[1];
  133.  
  134.                 val.setAmount(Integer.valueOf(amount));
  135.  
  136.                 Inventory playerInv = player.getInventory();
  137.  
  138.  
  139.                 if (playerInv.containsAtLeast(val, Integer.valueOf(amount))) {
  140.                     playerInv.removeItem(val);
  141.  
  142.                     EconomyResponse response = plugin.getEcon().depositPlayer(player, (sItem.getSellPrice() * Integer.valueOf(amount)));
  143.  
  144.                     if (response.transactionSuccess()) {
  145.                         player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getSellCompleted()).replace("%item%", sItem.getDisplayName())
  146.                                 .replace("%amount%", amount)
  147.                                 .replace("%price%", String.valueOf(Integer.valueOf(amount) * sItem.getSellPrice())));
  148.                         return;
  149.                     }
  150.                 } else {
  151.                     player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getNotEnoughItems()));
  152.                     return;
  153.                 }
  154.             }
  155.         } else if (display.startsWith("Buy")) {
  156.  
  157.             ShopItem sItem = buyingItem.get(player.getUniqueId());
  158.  
  159.             if (!sItem.isCanBuy()) {
  160.                 player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getCannotBuy()));
  161.                 return;
  162.             }
  163.  
  164.             String amount = ChatColor.stripColor(clickedMeta.getLore().get(0)).split(" ")[1];
  165.             double bal = plugin.getEcon().getBalance(player);
  166.  
  167.             double price = (sItem.getBuyPrice() * Integer.valueOf(amount));
  168.  
  169.             if ((bal - price) < 0) {
  170.                 player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getInsufficientFunds()));
  171.                 return;
  172.             }
  173.  
  174.             EconomyResponse response = plugin.getEcon().withdrawPlayer(player, (sItem.getBuyPrice() * Integer.valueOf(amount)));
  175.  
  176.  
  177.             if (response.transactionSuccess()) {
  178.                 player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getPurchaseCompleted())
  179.                         .replace("%price%", String.valueOf(price))
  180.                         .replace("%amount%", amount)
  181.                         .replace("%item%", sItem.getDisplayName()));
  182.  
  183.                 if (val.getMaxStackSize() == 1) {
  184.                     val.setAmount(1);
  185.                     for (int i = 0; i < Integer.valueOf(amount); i++) {
  186.                         player.getInventory().addItem(val);
  187.                     }
  188.                 } else {
  189.                     val.setAmount(Integer.valueOf(amount));
  190.                     player.getInventory().addItem(val);
  191.                 }
  192.             } else {
  193.                 player.sendMessage(ChatColor.RED + "Error occurred: " + response.errorMessage);
  194.                 return;
  195.             }
  196.         }
  197.  
  198.     }
  199.  
  200.     @EventHandler
  201.     public void onInvClose(InventoryCloseEvent event) {
  202.         Player player = (Player) event.getPlayer();
  203.  
  204.         if (!event.getInventory().getTitle().startsWith("Shop =>")) {
  205.             return;
  206.         }
  207.  
  208.         if (buyingItem.containsKey(player.getUniqueId())) {
  209.             buyingItem.remove(player.getUniqueId());
  210.         }
  211.  
  212.         if (pages.containsKey(player.getUniqueId())) {
  213.             pages.remove(player.getUniqueId());
  214.         }
  215.     }
  216.  
  217.     @EventHandler
  218.     public void onShopClick(InventoryClickEvent event) {
  219.         final Player player = (Player) event.getWhoClicked();
  220.  
  221.         if (event.getInventory() == null || event.getClickedInventory() == null)
  222.             return;
  223.  
  224.         if (!event.getClickedInventory().getTitle().equalsIgnoreCase("Shops"))
  225.             return;
  226.  
  227.         event.setResult(Event.Result.DENY);
  228.  
  229.  
  230.         ItemStack item = event.getCurrentItem();
  231.  
  232.         if (item == null || item.getType() == Material.AIR)
  233.             return;
  234.  
  235.         String name = item.getItemMeta().getDisplayName();
  236.  
  237.         final ShopCategory shop = plugin.getShopConfig().getShop(name);
  238.  
  239.         if (shop == null)
  240.             return;
  241.  
  242.         if (!player.hasPermission("dubshops." + shop.getName().toLowerCase())) {
  243.             player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getNoPermission()));
  244.             return;
  245.         }
  246.  
  247.         player.closeInventory();
  248.  
  249.         new BukkitRunnable() {
  250.             public void run() {
  251.                 player.openInventory(shop.create());
  252.                 pages.put(player.getUniqueId(), 1);
  253.             }
  254.         }.runTaskLater(plugin, 1L);
  255.  
  256.     }
  257.  
  258.     @EventHandler
  259.     public void onInvClick(InventoryClickEvent event) {
  260.  
  261.         final Player player = (Player) event.getWhoClicked();
  262.  
  263.         if (event.getInventory() == null || event.getClickedInventory() == null)
  264.             return;
  265.  
  266.         String title = event.getClickedInventory().getTitle();
  267.  
  268.         if (!plugin.getShopConfig().isShop(title))
  269.             return;
  270.  
  271.         event.setResult(Event.Result.DENY);
  272.  
  273.         final ShopCategory shop = plugin.getShopConfig().getShop(title);
  274.  
  275.         if (!pages.containsKey(player.getUniqueId())) {
  276.             pages.put(player.getUniqueId(), 1);
  277.         }
  278.  
  279.         int pageID = pages.get(player.getUniqueId());
  280.  
  281.         final ShopPage page = shop.getPage(pageID);
  282.  
  283.         if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR)
  284.             return;
  285.  
  286.         ItemStack item = event.getCurrentItem();
  287.  
  288.  
  289.         if (item.getType() == Material.ARROW) {
  290.             //Dealing with back and next pages
  291.  
  292.             if (item.getItemMeta().getDisplayName().contains("Previous")) {
  293.                 if (pageID == 1) {
  294.                     player.sendMessage(ChatColor.RED + "You cannot go back!");
  295.                     return;
  296.                 }
  297.  
  298.                 final int newId = pageID - 1;
  299.  
  300.                 player.closeInventory();
  301.                 new BukkitRunnable() {
  302.                     public void run() {
  303.                         player.openInventory(shop.getPage(newId).create());
  304.                         pages.put(player.getUniqueId(), newId);
  305.                     }
  306.                 }.runTaskLater(plugin, 1L);
  307.             } else {
  308.                 if (pageID >= shop.getPages().size()) {
  309.                     player.sendMessage(ChatColor.RED + "There are no more pages!");
  310.                     return;
  311.                 }
  312.  
  313.                 final int newId = pageID + 1;
  314.                 player.closeInventory();
  315.                 new BukkitRunnable() {
  316.                     public void run() {
  317.                         player.openInventory(shop.getPage(newId).create());
  318.                         pages.put(player.getUniqueId(), newId);
  319.                     }
  320.                 }.runTaskLater(plugin, 1L);
  321.             }
  322.         } else if (item.getType() == Material.PAPER) {
  323.             return;
  324.         }
  325.         else if (item.getType() == Material.CHEST) {
  326.             player.closeInventory();
  327.  
  328.             new BukkitRunnable() {
  329.                 public void run() {
  330.                     player.openInventory(plugin.getShopConfig().create());
  331.                 }
  332.             }.runTaskLater(plugin, 1L);
  333.         }
  334.         else {
  335.             final ShopItem clicked = page.getItemAt(event.getSlot());
  336.  
  337.             if (this.buyingItem.containsKey(player.getUniqueId())) {
  338.                 buyingItem.remove(player.getUniqueId());
  339.             }
  340.  
  341.             buyingItem.put(player.getUniqueId(), clicked);
  342.  
  343.             player.closeInventory();
  344.  
  345.             new BukkitRunnable() {
  346.                 public void run() {
  347.                     openBuySell(player, clicked);
  348.                 }
  349.             }.runTaskLater(plugin, 1L);
  350.         }
  351.     }
  352.  
  353.     private void openBuySell(Player player, ShopItem item) {
  354.  
  355.         int[] items = new int[]{4, 13, 22};
  356.         int[] panes = new int[]{3, 5, 12, 14, 21, 23};
  357.  
  358.         Map<Integer, String> values = new HashMap<>();
  359.  
  360.         values.put(3, "Buy 1");
  361.         values.put(5, "Sell 1");
  362.         values.put(12, "Buy 8");
  363.         values.put(14, "Sell 8");
  364.         values.put(21, "Buy 64");
  365.         values.put(23, "Sell 64");
  366.  
  367.         //Green Panes:
  368.  
  369.         Inventory buySell = Bukkit.createInventory(null, 54, "Shop => " + ChatColor.translateAlternateColorCodes('&', item.getDisplayName()));
  370.  
  371.         for (int i = 0; i < panes.length; i++) {
  372.  
  373.             int data = panes[i] % 3 == 0 ? 5 : 14;
  374.  
  375.             if (panes[i] % 3 == 0) {
  376.                 if (!item.isCanBuy()) {
  377.                     data = 7;
  378.                 }
  379.             } else {
  380.                 if (!item.isCanSell()) {
  381.                     data = 7;
  382.                 }
  383.             }
  384.  
  385.             ItemStack pane = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) data);
  386.             ItemMeta meta = pane.getItemMeta();
  387.  
  388.             String name = values.get(panes[i]).split(" ")[0];
  389.             meta.setDisplayName(name);
  390.  
  391.             List<String> lore = new ArrayList<>();
  392.             int amount = Integer.valueOf(values.get(panes[i]).split(" ")[1]);
  393.  
  394.             if (data == 5) {
  395.  
  396.                 for (String l : plugin.getLocale().getPaneLore()) {
  397.                     lore.add(ChatColor.translateAlternateColorCodes('&', l).replace("%price%", String.valueOf(amount * item.getBuyPrice())).replace("%amount%", String.valueOf(amount)));
  398.                 }
  399.  
  400.             } else if (data == 14) {
  401.                 for (String l : plugin.getLocale().getPaneLore()) {
  402.                     lore.add(ChatColor.translateAlternateColorCodes('&', l).replace("%price%", String.valueOf(amount * item.getSellPrice())).replace("%amount%", String.valueOf(amount)));
  403.                 }
  404.             } else {
  405.                 for (String l : plugin.getLocale().getUnavailableLore()) {
  406.                     lore.add(ChatColor.translateAlternateColorCodes('&', l));
  407.                 }
  408.             }
  409.  
  410.             meta.setLore(lore);
  411.  
  412.             pane.setItemMeta(meta);
  413.             buySell.setItem(panes[i], pane);
  414.         }
  415.  
  416.         for (int i = 0; i < items.length; i++) {
  417.  
  418.             ItemStack display = item.createDisplay().clone();
  419.  
  420.             int amount = (int) Math.pow(8, i);
  421.             display.setAmount(amount);
  422.  
  423.             buySell.setItem(items[i], display);
  424.         }
  425.  
  426.         ItemStack sellAll = new ItemStack(Material.BUCKET, 1);
  427.         ItemMeta bucketMeta = sellAll.getItemMeta();
  428.  
  429.         bucketMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getSellAllName()));
  430.  
  431.         List<String> bLore = new ArrayList<>();
  432.  
  433.         int itemAmount = 0;
  434.  
  435.         for (ItemStack i : player.getInventory()) {
  436.  
  437.             if (i == null) continue;
  438.  
  439.             if (i.getType().getId() == item.getItemID() && i.getData().getData() == item.getData()) {
  440.  
  441.                 itemAmount += i.getAmount();
  442.             }
  443.         }
  444.  
  445.         for (String l : plugin.getLocale().getSellAllLore()) {
  446.             bLore.add(ChatColor.translateAlternateColorCodes('&', l).replace("%total%", String.valueOf(item.getSellPrice() * itemAmount)));
  447.         }
  448.  
  449.         bucketMeta.setLore(bLore);
  450.  
  451.         sellAll.setItemMeta(bucketMeta);
  452.  
  453.         ItemStack close = new ItemStack(Material.BARRIER, 1);
  454.         ItemMeta closeMeta = close.getItemMeta();
  455.  
  456.         closeMeta.setDisplayName(ChatColor.RED + "Close");
  457.         closeMeta.setLore(Collections.singletonList(ChatColor.WHITE + ChatColor.UNDERLINE.toString() + "Click to close the menu"));
  458.         close.setItemMeta(closeMeta);
  459.  
  460.         ItemStack back = new ItemStack(Material.ARROW, 1);
  461.         ItemMeta backMeta = back.getItemMeta();
  462.  
  463.         backMeta.setDisplayName(ChatColor.RED + "Back");
  464.         back.setItemMeta(backMeta);
  465.  
  466.         buySell.setItem(31, sellAll);
  467.         buySell.setItem(53, close);
  468.         buySell.setItem(45, back);
  469.  
  470.         player.openInventory(buySell);
  471.     }
  472. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement