diff --git a/pom.xml b/pom.xml index 60b0179..6cb3b0b 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ cc.carm.plugin ultradepository jar - 1.1.4 + 1.1.5 UltraDepository 超级仓库插件,支持设定不同物品的存储仓库。 diff --git a/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java b/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java index ce81895..95dcff5 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java +++ b/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java @@ -3,7 +3,6 @@ package cc.carm.plugin.ultradepository.configuration.depository; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,9 +44,8 @@ public class DepositoryCapacity { public int getPlayerCapacity(Player player) { return getPermissions().entrySet().stream() .filter(entry -> player.hasPermission(entry.getKey())) - .map(Map.Entry::getValue) - .min(Comparator.comparingInt(Integer::intValue)) - .orElse(defaultCapacity); + .mapToInt(Map.Entry::getValue) + .max().orElse(defaultCapacity); } } diff --git a/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java b/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java index 00be5d8..8475286 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java +++ b/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java @@ -2,8 +2,6 @@ package cc.carm.plugin.ultradepository.listener; import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.configuration.PluginConfig; -import org.bukkit.Material; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -26,9 +24,7 @@ public class CollectListener implements Listener { Player player = event.getPlayer(); if (!Main.getUserManager().isCollectEnabled(player)) return; - if (event.getBlock().getType() == Material.CHEST || event.getBlock().getType() == Material.TRAPPED_CHEST) { - return; - } + if (event.getBlock().getType().isOccluding()) return; List droppedItems = event.getItems(); if (droppedItems.isEmpty()) return; diff --git a/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java b/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java index 9fbaf7e..8ed0696 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java +++ b/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java @@ -7,7 +7,6 @@ import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.data.UserData; import com.google.common.collect.HashMultimap; -import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -112,12 +111,10 @@ public class DepositoryManager { } public Set getPlayerUsableDepository(Player player, ItemStack itemStack) { - String typeID = getItemTypeID(itemStack); return getItemDepositories(itemStack).stream().filter(configuration -> { - int currentAmount = Optional.ofNullable(Main.getUserManager().getData(player) - .getItemAmount(configuration.getIdentifier(), typeID)).orElse(0); - int depositoryCapacity = configuration.getCapacity().getPlayerCapacity(player); - return currentAmount + itemStack.getAmount() <= depositoryCapacity; + int used = Main.getUserManager().getData(player).getDepositoryData(configuration).getUsedCapacity(); + int max = configuration.getCapacity().getPlayerCapacity(player); + return used + itemStack.getAmount() <= max; }).collect(Collectors.toSet()); } diff --git a/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java b/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java index ef126aa..670c89e 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java +++ b/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java @@ -65,18 +65,13 @@ public class DepositoryGUI extends GUI { } if (type == ClickType.LEFT) { - player.closeInventory(); - if (itemData.getAmount() >= 1) { - if (remain >= 1) { - SellItemGUI.open(player, userData, itemData, depository, item); - } else { - PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{remain, item.getLimit()}); - } + if (remain >= 1) { + SellItemGUI.open(player, userData, itemData, depository, item); } else { - PluginMessages.NO_ENOUGH_ITEM.send(player); + PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{remain, item.getLimit()}); } } else if (type == ClickType.RIGHT) { - player.closeInventory(); + if (hasEmptySlot(player)) { int pickupAmount = Math.min(itemData.getAmount(), item.getMaterial().getMaxStackSize()); userData.removeItemAmount(item.getDepository().getIdentifier(), item.getTypeID(), pickupAmount); @@ -84,8 +79,11 @@ public class DepositoryGUI extends GUI { PluginMessages.PICKUP.send(player, new Object[]{ item.getName(), pickupAmount }); + setupItems(); //刷新GUI + updateView(); } else { PluginMessages.NO_SPACE.send(player); + player.closeInventory(); } } } @@ -99,6 +97,7 @@ public class DepositoryGUI extends GUI { } public static void open(@NotNull Player player, @NotNull Depository depository) { + player.closeInventory(); DepositoryGUI gui = new DepositoryGUI(player, depository); gui.openGUI(player); } diff --git a/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java b/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java index 8b730e3..0b1dd53 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java +++ b/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java @@ -2,6 +2,7 @@ package cc.carm.plugin.ultradepository.ui; import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.configuration.PluginConfig; +import cc.carm.plugin.ultradepository.configuration.PluginMessages; import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.data.DepositoryItemData; @@ -177,7 +178,12 @@ public class SellItemGUI extends GUI { public static void open(Player player, UserData userData, DepositoryItemData itemData, Depository configuration, DepositoryItem item) { - if (!Main.getEconomyManager().isInitialized()) return; + player.closeInventory(); + if (!Main.getEconomyManager().isInitialized()) { + PluginMessages.NO_ECONOMY.send(player); + return; + } + SellItemGUI gui = new SellItemGUI(player, userData, itemData, configuration, item); gui.openGUI(player); } diff --git a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java b/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java index 2b30f14..69dc79d 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java +++ b/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java @@ -6,16 +6,18 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.IntStream; public class GUI { @@ -26,13 +28,13 @@ public class GUI { public GUIItem[] items; public Inventory inv; - boolean cancelOnTarget = true; - boolean cancelOnSelf = true; - boolean cancelOnOuter = true; + boolean setCancelledIfClickOnTarget = true; + boolean setCancelledIfClickOnSelf = true; + boolean setCancelledIfClickOnOuter = true; Map flags; - public GUIListener listener; + public Listener listener; public GUI(GUIType type, String name) { this.type = type; @@ -71,18 +73,10 @@ public class GUI { } } - /** - * 批量添加GUI Item - * - * @param item 物品 - * @param index 对应格 - */ public void setItem(GUIItem item, int... index) { - Arrays.stream(index).forEach(i -> setItem(i, item)); - } - - public void setItem(GUIItem item, int start, int end) { - IntStream.rangeClosed(start, end).forEach(i -> setItem(i, item)); + for (int i : index) { + setItem(i, item); + } } public GUIItem getItem(int index) { @@ -95,18 +89,14 @@ public class GUI { public void updateView() { if (this.inv != null) { List viewers = this.inv.getViewers(); - IntStream.range(0, this.items.length).forEach(index -> { - GUIItem item = items[index]; - if (item == null) { + for (int index = 0; index < this.items.length; index++) { + if (items[index] == null) { inv.setItem(index, new ItemStack(Material.AIR)); } else { inv.setItem(index, items[index].display); } - }); - - for (HumanEntity p : viewers) { - ((Player) p).updateInventory(); } + viewers.forEach(p -> ((Player) p).updateInventory()); } } @@ -117,7 +107,7 @@ public class GUI { * @param b 是否取消 */ public void setCancelledIfClickOnTarget(boolean b) { - this.cancelOnTarget = b; + this.setCancelledIfClickOnTarget = b; } /** @@ -127,7 +117,7 @@ public class GUI { * @param b 是否取消 */ public void setCancelledIfClickOnSelf(boolean b) { - this.cancelOnSelf = b; + this.setCancelledIfClickOnSelf = b; } /** @@ -137,7 +127,7 @@ public class GUI { * @param b 是否取消 */ public void setCancelledIfClickOnOuter(boolean b) { - this.cancelOnOuter = b; + this.setCancelledIfClickOnOuter = b; } public void addFlag(String flag, Object obj) { @@ -182,14 +172,78 @@ public class GUI { this.inv = inv; player.openInventory(inv); - if (listener == null) { - Main.regListener(listener = new GUIListener(this, player)); - } + if (listener == null) + Bukkit.getPluginManager().registerEvents(listener = new Listener() { + @EventHandler + public void onInventoryClickEvent(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) return; + Player player = (Player) event.getWhoClicked(); + if (!hasOpenedGUI(player)) return; + + rawClickListener(event); + if (event.getSlot() != -999) { + try { + if (getOpenedGUI(player) == GUI.this + && event.getClickedInventory() != null + && event.getClickedInventory().equals(GUI.this.inv) + && GUI.this.items[event.getSlot()] != null) { + GUI.this.items[event.getSlot()].realRawClickAction(event); + } + } catch (ArrayIndexOutOfBoundsException e) { + System.err.print("err cause by GUI(" + GUI.this + "), name=" + name); + e.printStackTrace(); + return; + } + } else if (setCancelledIfClickOnOuter) { + event.setCancelled(true); + } + + if (getOpenedGUI(player) == GUI.this + && event.getClickedInventory() != null) { + if (event.getClickedInventory().equals(GUI.this.inv)) { + if (setCancelledIfClickOnTarget) event.setCancelled(true); + + if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) { + GUIItem clickedItem = GUI.this.items[event.getSlot()]; + if (clickedItem.isActionActive()) { + clickedItem.onClick(event.getClick()); + clickedItem.rawClickAction(event); + clickedItem.actions.forEach(action -> action.run(event.getClick(), player)); + } + clickedItem.actionsIgnoreActive.forEach(action -> action.run(event.getClick(), player)); + } + } else if (event.getClickedInventory().equals(player.getInventory()) && setCancelledIfClickOnSelf) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onDrag(InventoryDragEvent e) { + if (!(e.getWhoClicked() instanceof Player)) return; + if (e.getInventory().equals(inv) + || e.getInventory().equals(e.getWhoClicked().getInventory())) { + GUI.this.onDrag(e); + } + } + + @EventHandler + public void onInventoryCloseEvent(InventoryCloseEvent event) { + if (!(event.getPlayer() instanceof Player)) return; + if (!event.getInventory().equals(inv)) return; + + HandlerList.unregisterAll(this); + listener = null; + removeOpenedGUI((Player) event.getPlayer()); + onClose(); + + } + }, Main.getInstance()); } /** - * 拖动GUI内物品时执行的代码 + * 拖动GUI内物品是执行的代码 * * @param event InventoryDragEvent */ diff --git a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUIListener.java b/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUIListener.java deleted file mode 100644 index 1794227..0000000 --- a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUIListener.java +++ /dev/null @@ -1,109 +0,0 @@ -package cc.carm.plugin.ultradepository.util.gui; - -import cc.carm.plugin.ultradepository.Main; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.inventory.InventoryOpenEvent; - -public class GUIListener implements Listener { - - final GUI currentGUI; - final Player player; - - public GUIListener(GUI gui, Player player) { - this.currentGUI = gui; - this.player = player; - } - - public GUI getCurrentGUI() { - return currentGUI; - } - - @EventHandler - public void onInventoryClickEvent(InventoryClickEvent event) { - if (!(event.getWhoClicked() instanceof Player)) return; - getCurrentGUI().rawClickListener(event); - - Player p = (Player) event.getWhoClicked(); - if (event.getSlot() != -999) { - try { - if (GUI.getOpenedGUI(p) == getCurrentGUI() - && event.getClickedInventory() != null - && event.getClickedInventory().equals(getCurrentGUI().inv) - && getCurrentGUI().items[event.getSlot()] != null) { - getCurrentGUI().items[event.getSlot()].realRawClickAction(event); - } - } catch (ArrayIndexOutOfBoundsException e) { - Main.error("error cause by GUI(" + getCurrentGUI() + "), name=" + getCurrentGUI().name); - e.printStackTrace(); - return; - } - } else if (getCurrentGUI().cancelOnOuter) { - event.setCancelled(true); - } - - if (GUI.hasOpenedGUI(p) - && GUI.getOpenedGUI(p) == getCurrentGUI() - && event.getClickedInventory() != null) { - - if (event.getClickedInventory().equals(getCurrentGUI().inv)) { - if (getCurrentGUI().cancelOnTarget) event.setCancelled(true); - - if (event.getSlot() != -999 && getCurrentGUI().items[event.getSlot()] != null) { - - GUIItem item = getCurrentGUI().items[event.getSlot()]; - - if (item.isActionActive()) { - item.onClick(event.getClick()); - item.rawClickAction(event); - item.actions.forEach(action -> action.run(event.getClick(), player)); - } - - item.actionsIgnoreActive.forEach(action -> action.run(event.getClick(), player)); - - } - } else if (event.getClickedInventory().equals(p.getInventory()) && getCurrentGUI().cancelOnSelf) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onDrag(InventoryDragEvent e) { - if (!(e.getWhoClicked() instanceof Player)) return; - Player p = (Player) e.getWhoClicked(); - if (e.getInventory().equals(getCurrentGUI().inv) || e.getInventory().equals(p.getInventory())) { - getCurrentGUI().onDrag(e); - } - - } - - @EventHandler - public void onInventoryCloseEvent(InventoryCloseEvent event) { - Player p = (Player) event.getPlayer(); - if (event.getInventory().equals(getCurrentGUI().inv)) { - HandlerList.unregisterAll(this); - getCurrentGUI().listener = null; - getCurrentGUI().onClose(); - GUI.removeOpenedGUI(p); - } - } - - @EventHandler - public void onOpen(InventoryOpenEvent event) { - Player p = (Player) event.getPlayer(); - //开启新界面后 结束旧界面 - if (!event.getInventory().equals(getCurrentGUI().inv)) { - HandlerList.unregisterAll(this); - getCurrentGUI().listener = null; - getCurrentGUI().onClose(); - GUI.removeOpenedGUI(p); - } - } - -}