Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.dubcraft.npcshop.listeners;
- import com.google.common.collect.Lists;
- import net.dubcraft.npcshop.NPCShop;
- import net.dubcraft.npcshop.config.ShopCategory;
- import net.dubcraft.npcshop.config.ShopItem;
- import net.dubcraft.npcshop.config.ShopPage;
- import net.milkbowl.vault.economy.EconomyResponse;
- import org.bukkit.Bukkit;
- import org.bukkit.ChatColor;
- import org.bukkit.Material;
- import org.bukkit.entity.Player;
- import org.bukkit.event.Event;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.inventory.InventoryClickEvent;
- import org.bukkit.event.inventory.InventoryCloseEvent;
- import org.bukkit.inventory.Inventory;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.inventory.meta.ItemMeta;
- import org.bukkit.scheduler.BukkitRunnable;
- import java.util.*;
- public class ShopInvListener implements Listener {
- private NPCShop plugin;
- public ShopInvListener(NPCShop plugin) {
- this.plugin = plugin;
- }
- private HashMap<UUID, ShopItem> buyingItem = new HashMap<>();
- private HashMap<UUID, Integer> pages = new HashMap<>();
- @EventHandler
- public void onBuySell(InventoryClickEvent event) {
- final Player player = (Player) event.getWhoClicked();
- if (event.getInventory() == null || event.getClickedInventory() == null)
- return;
- if (!event.getClickedInventory().getTitle().startsWith("Shop =>"))
- return;
- event.setResult(Event.Result.DENY);
- ItemStack item = event.getCurrentItem();
- if (item == null || item.getType() == Material.AIR)
- return;
- if (item.getType() == Material.BARRIER) {
- player.closeInventory();
- return;
- }
- if (item.getType() == Material.ARROW) {
- final ShopCategory cat = buyingItem.get(player.getUniqueId()).getOwner();
- player.closeInventory();
- new BukkitRunnable() {
- public void run() {
- player.openInventory(cat.create());
- }
- }.runTaskLater(plugin, 1L);
- return;
- }
- Material type = event.getClickedInventory().getItem(4).getType();
- ItemStack val = new ItemStack(type);
- ItemMeta clickedMeta = item.getItemMeta();
- String display = ChatColor.stripColor(clickedMeta.getDisplayName());
- if (display.startsWith("Sell")) {
- if (item.getType() == Material.BUCKET) {
- if (!buyingItem.get(player.getUniqueId()).isCanSell()) {
- player.sendMessage(plugin.getLocale().getCannotSell());
- return;
- }
- int total = 0;
- int totalAmount = 0;
- for (int i = 0; i < player.getInventory().getSize(); i++) {
- ShopItem shopItem = buyingItem.get(player.getUniqueId());
- ItemStack current = player.getInventory().getItem(i);
- if (current == null || current.getType() == Material.AIR) {
- continue;
- }
- int amount = current.getAmount();
- if (current.getType().getId() != shopItem.getItemID()) {
- continue;
- }
- if (current.getData().getData() != shopItem.getData()) {
- continue;
- }
- player.getInventory().setItem(i, new ItemStack(Material.AIR));
- total += (shopItem.getSellPrice() * amount);
- totalAmount += amount;
- plugin.getEcon().depositPlayer(player, (shopItem.getSellPrice() * amount));
- }
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getSellCompleted()).replace("%item%", buyingItem.get(player.getUniqueId()).getDisplayName())
- .replace("%amount%", String.valueOf(totalAmount))
- .replace("%price%", String.valueOf(total)));
- } else {
- ShopItem sItem = buyingItem.get(player.getUniqueId());
- if (!sItem.isCanSell()) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getCannotSell()));
- return;
- }
- String amount = ChatColor.stripColor(clickedMeta.getLore().get(0)).split(" ")[1];
- val.setAmount(Integer.valueOf(amount));
- Inventory playerInv = player.getInventory();
- if (playerInv.containsAtLeast(val, Integer.valueOf(amount))) {
- playerInv.removeItem(val);
- EconomyResponse response = plugin.getEcon().depositPlayer(player, (sItem.getSellPrice() * Integer.valueOf(amount)));
- if (response.transactionSuccess()) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getSellCompleted()).replace("%item%", sItem.getDisplayName())
- .replace("%amount%", amount)
- .replace("%price%", String.valueOf(Integer.valueOf(amount) * sItem.getSellPrice())));
- return;
- }
- } else {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getNotEnoughItems()));
- return;
- }
- }
- } else if (display.startsWith("Buy")) {
- ShopItem sItem = buyingItem.get(player.getUniqueId());
- if (!sItem.isCanBuy()) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getCannotBuy()));
- return;
- }
- String amount = ChatColor.stripColor(clickedMeta.getLore().get(0)).split(" ")[1];
- double bal = plugin.getEcon().getBalance(player);
- double price = (sItem.getBuyPrice() * Integer.valueOf(amount));
- if ((bal - price) < 0) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getInsufficientFunds()));
- return;
- }
- EconomyResponse response = plugin.getEcon().withdrawPlayer(player, (sItem.getBuyPrice() * Integer.valueOf(amount)));
- if (response.transactionSuccess()) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getPurchaseCompleted())
- .replace("%price%", String.valueOf(price))
- .replace("%amount%", amount)
- .replace("%item%", sItem.getDisplayName()));
- if (val.getMaxStackSize() == 1) {
- val.setAmount(1);
- for (int i = 0; i < Integer.valueOf(amount); i++) {
- player.getInventory().addItem(val);
- }
- } else {
- val.setAmount(Integer.valueOf(amount));
- player.getInventory().addItem(val);
- }
- } else {
- player.sendMessage(ChatColor.RED + "Error occurred: " + response.errorMessage);
- return;
- }
- }
- }
- @EventHandler
- public void onInvClose(InventoryCloseEvent event) {
- Player player = (Player) event.getPlayer();
- if (!event.getInventory().getTitle().startsWith("Shop =>")) {
- return;
- }
- if (buyingItem.containsKey(player.getUniqueId())) {
- buyingItem.remove(player.getUniqueId());
- }
- if (pages.containsKey(player.getUniqueId())) {
- pages.remove(player.getUniqueId());
- }
- }
- @EventHandler
- public void onShopClick(InventoryClickEvent event) {
- final Player player = (Player) event.getWhoClicked();
- if (event.getInventory() == null || event.getClickedInventory() == null)
- return;
- if (!event.getClickedInventory().getTitle().equalsIgnoreCase("Shops"))
- return;
- event.setResult(Event.Result.DENY);
- ItemStack item = event.getCurrentItem();
- if (item == null || item.getType() == Material.AIR)
- return;
- String name = item.getItemMeta().getDisplayName();
- final ShopCategory shop = plugin.getShopConfig().getShop(name);
- if (shop == null)
- return;
- if (!player.hasPermission("dubshops." + shop.getName().toLowerCase())) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getNoPermission()));
- return;
- }
- player.closeInventory();
- new BukkitRunnable() {
- public void run() {
- player.openInventory(shop.create());
- pages.put(player.getUniqueId(), 1);
- }
- }.runTaskLater(plugin, 1L);
- }
- @EventHandler
- public void onInvClick(InventoryClickEvent event) {
- final Player player = (Player) event.getWhoClicked();
- if (event.getInventory() == null || event.getClickedInventory() == null)
- return;
- String title = event.getClickedInventory().getTitle();
- if (!plugin.getShopConfig().isShop(title))
- return;
- event.setResult(Event.Result.DENY);
- final ShopCategory shop = plugin.getShopConfig().getShop(title);
- if (!pages.containsKey(player.getUniqueId())) {
- pages.put(player.getUniqueId(), 1);
- }
- int pageID = pages.get(player.getUniqueId());
- final ShopPage page = shop.getPage(pageID);
- if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR)
- return;
- ItemStack item = event.getCurrentItem();
- if (item.getType() == Material.ARROW) {
- //Dealing with back and next pages
- if (item.getItemMeta().getDisplayName().contains("Previous")) {
- if (pageID == 1) {
- player.sendMessage(ChatColor.RED + "You cannot go back!");
- return;
- }
- final int newId = pageID - 1;
- player.closeInventory();
- new BukkitRunnable() {
- public void run() {
- player.openInventory(shop.getPage(newId).create());
- pages.put(player.getUniqueId(), newId);
- }
- }.runTaskLater(plugin, 1L);
- } else {
- if (pageID >= shop.getPages().size()) {
- player.sendMessage(ChatColor.RED + "There are no more pages!");
- return;
- }
- final int newId = pageID + 1;
- player.closeInventory();
- new BukkitRunnable() {
- public void run() {
- player.openInventory(shop.getPage(newId).create());
- pages.put(player.getUniqueId(), newId);
- }
- }.runTaskLater(plugin, 1L);
- }
- } else if (item.getType() == Material.PAPER) {
- return;
- }
- else if (item.getType() == Material.CHEST) {
- player.closeInventory();
- new BukkitRunnable() {
- public void run() {
- player.openInventory(plugin.getShopConfig().create());
- }
- }.runTaskLater(plugin, 1L);
- }
- else {
- final ShopItem clicked = page.getItemAt(event.getSlot());
- if (this.buyingItem.containsKey(player.getUniqueId())) {
- buyingItem.remove(player.getUniqueId());
- }
- buyingItem.put(player.getUniqueId(), clicked);
- player.closeInventory();
- new BukkitRunnable() {
- public void run() {
- openBuySell(player, clicked);
- }
- }.runTaskLater(plugin, 1L);
- }
- }
- private void openBuySell(Player player, ShopItem item) {
- int[] items = new int[]{4, 13, 22};
- int[] panes = new int[]{3, 5, 12, 14, 21, 23};
- Map<Integer, String> values = new HashMap<>();
- values.put(3, "Buy 1");
- values.put(5, "Sell 1");
- values.put(12, "Buy 8");
- values.put(14, "Sell 8");
- values.put(21, "Buy 64");
- values.put(23, "Sell 64");
- //Green Panes:
- Inventory buySell = Bukkit.createInventory(null, 54, "Shop => " + ChatColor.translateAlternateColorCodes('&', item.getDisplayName()));
- for (int i = 0; i < panes.length; i++) {
- int data = panes[i] % 3 == 0 ? 5 : 14;
- if (panes[i] % 3 == 0) {
- if (!item.isCanBuy()) {
- data = 7;
- }
- } else {
- if (!item.isCanSell()) {
- data = 7;
- }
- }
- ItemStack pane = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) data);
- ItemMeta meta = pane.getItemMeta();
- String name = values.get(panes[i]).split(" ")[0];
- meta.setDisplayName(name);
- List<String> lore = new ArrayList<>();
- int amount = Integer.valueOf(values.get(panes[i]).split(" ")[1]);
- if (data == 5) {
- for (String l : plugin.getLocale().getPaneLore()) {
- lore.add(ChatColor.translateAlternateColorCodes('&', l).replace("%price%", String.valueOf(amount * item.getBuyPrice())).replace("%amount%", String.valueOf(amount)));
- }
- } else if (data == 14) {
- for (String l : plugin.getLocale().getPaneLore()) {
- lore.add(ChatColor.translateAlternateColorCodes('&', l).replace("%price%", String.valueOf(amount * item.getSellPrice())).replace("%amount%", String.valueOf(amount)));
- }
- } else {
- for (String l : plugin.getLocale().getUnavailableLore()) {
- lore.add(ChatColor.translateAlternateColorCodes('&', l));
- }
- }
- meta.setLore(lore);
- pane.setItemMeta(meta);
- buySell.setItem(panes[i], pane);
- }
- for (int i = 0; i < items.length; i++) {
- ItemStack display = item.createDisplay().clone();
- int amount = (int) Math.pow(8, i);
- display.setAmount(amount);
- buySell.setItem(items[i], display);
- }
- ItemStack sellAll = new ItemStack(Material.BUCKET, 1);
- ItemMeta bucketMeta = sellAll.getItemMeta();
- bucketMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', plugin.getLocale().getSellAllName()));
- List<String> bLore = new ArrayList<>();
- int itemAmount = 0;
- for (ItemStack i : player.getInventory()) {
- if (i == null) continue;
- if (i.getType().getId() == item.getItemID() && i.getData().getData() == item.getData()) {
- itemAmount += i.getAmount();
- }
- }
- for (String l : plugin.getLocale().getSellAllLore()) {
- bLore.add(ChatColor.translateAlternateColorCodes('&', l).replace("%total%", String.valueOf(item.getSellPrice() * itemAmount)));
- }
- bucketMeta.setLore(bLore);
- sellAll.setItemMeta(bucketMeta);
- ItemStack close = new ItemStack(Material.BARRIER, 1);
- ItemMeta closeMeta = close.getItemMeta();
- closeMeta.setDisplayName(ChatColor.RED + "Close");
- closeMeta.setLore(Collections.singletonList(ChatColor.WHITE + ChatColor.UNDERLINE.toString() + "Click to close the menu"));
- close.setItemMeta(closeMeta);
- ItemStack back = new ItemStack(Material.ARROW, 1);
- ItemMeta backMeta = back.getItemMeta();
- backMeta.setDisplayName(ChatColor.RED + "Back");
- back.setItemMeta(backMeta);
- buySell.setItem(31, sellAll);
- buySell.setItem(53, close);
- buySell.setItem(45, back);
- player.openInventory(buySell);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement